Teradata - Guida rapida
Cos'è Teradata?
Teradata è uno dei più diffusi sistemi di gestione di database relazionali. È adatto principalmente per la creazione di applicazioni di data warehousing su larga scala. Teradata ottiene questo risultato dal concetto di parallelismo. È sviluppato dalla società chiamata Teradata.
Storia di Teradata
Di seguito è riportato un breve riassunto della storia di Teradata, elencando le tappe principali.
1979 - Viene incorporata Teradata.
1984 - Rilascio del primo computer database DBC / 1012.
1986- La rivista Fortune nomina Teradata "Prodotto dell'anno".
1999 - Il più grande database al mondo che utilizza Teradata con 130 Terabyte.
2002 - Teradata V2R5 rilasciato con Partition Primary Index e compressione.
2006 - Lancio della soluzione Teradata Master Data Management.
2008 - Teradata 13.0 rilasciato con Active Data Warehousing.
2011 - Acquisisce Teradata Aster ed entra in Advanced Analytics Space.
2012 - Teradata 14.0 introdotto.
2014 - Teradata 15.0 introdotto.
Caratteristiche di Teradata
Di seguito sono riportate alcune delle caratteristiche di Teradata:
Unlimited Parallelism- Il sistema di database Teradata è basato sull'architettura Massively Parallel Processing (MPP). L'architettura MPP divide il carico di lavoro in modo uniforme sull'intero sistema. Il sistema Teradata suddivide l'attività tra i suoi processi e li esegue in parallelo per garantire che l'attività venga completata rapidamente.
Shared Nothing Architecture- L'architettura di Teradata è chiamata Shared Nothing Architecture. I nodi Teradata, i suoi processori del modulo di accesso (AMP) ei dischi associati agli AMP funzionano in modo indipendente. Non sono condivisi con altri.
Linear Scalability- I sistemi Teradata sono altamente scalabili. Possono scalare fino a 2048 nodi. Ad esempio, puoi raddoppiare la capacità del sistema raddoppiando il numero di AMP.
Connectivity - Teradata può connettersi a sistemi collegati al canale come mainframe o sistemi collegati alla rete.
Mature Optimizer- L'ottimizzatore Teradata è uno degli ottimizzatori maturati sul mercato. È stato progettato per essere parallelo sin dal suo inizio. È stato perfezionato per ogni versione.
SQL- Teradata supporta SQL standard del settore per interagire con i dati archiviati nelle tabelle. Oltre a questo, fornisce la propria estensione.
Robust Utilities - Teradata fornisce robuste utilità per importare / esportare dati da / a sistemi Teradata come FastLoad, MultiLoad, FastExport e TPT.
Automatic Distribution - Teradata distribuisce automaticamente i dati in modo uniforme sui dischi senza alcun intervento manuale.
Teradata fornisce Teradata Express per VMWARE, una macchina virtuale Teradata completamente operativa. Fornisce fino a 1 terabyte di spazio di archiviazione. Teradata fornisce sia la versione da 40 GB che da 1 TB di VMware.
Prerequisiti
Poiché la VM è a 64 bit, la CPU deve supportare 64 bit.
Fasi di installazione per Windows
Step 1 - Scarica la versione VM richiesta dal link, https://downloads.teradata.com/download/database/teradata-express-for-vmware-player
Step 2 - Estrai il file e specifica la cartella di destinazione.
Step 3 - Scarica il lettore VMWare Workstation dal link, https://my.vmware.com/web/vmware/downloads. È disponibile sia per Windows che per Linux. Scarica il lettore di workstation VMWARE per Windows.
Step 4 - Una volta completato il download, installa il software.
Step 5 - Al termine dell'installazione, eseguire il client VMWARE.
Step 6- Seleziona "Apri una macchina virtuale". Naviga nella cartella Teradata VMWare estratta e seleziona il file con estensione .vmdk.
Step 7- Teradata VMWare viene aggiunto al client VMWare. Seleziona il Teradata VMware aggiunto e fai clic su "Riproduci macchina virtuale".
Step 8 - Se viene visualizzato un popup sugli aggiornamenti software, è possibile selezionare "Ricordamelo più tardi".
Step 9 - Immettere il nome utente come root, premere tab e immettere la password come root e premere nuovamente Invio.
Step 10- Quando viene visualizzata la seguente schermata sul desktop, fare doppio clic su "home di root". Quindi fare doppio clic su "Genome's Terminal". Questo aprirà Shell.
Step 11- Dalla seguente shell, inserisci il comando /etc/init.d/tpa start. Questo avvierà il server Teradata.
Avvio di BTEQ
L'utilità BTEQ viene utilizzata per inviare query SQL in modo interattivo. Di seguito sono riportati i passaggi per avviare l'utilità BTEQ.
Step 1 - Immettere il comando / sbin / ifconfig e annotare l'indirizzo IP di VMWare.
Step 2- Esegui il comando bteq. Al prompt di accesso, inserisci il comando.
Logon <ipaddress> / dbc, dbc; e immettere Alla richiesta della password, immettere la password come dbc;
Puoi accedere al sistema Teradata utilizzando BTEQ ed eseguire qualsiasi query SQL.
L'architettura Teradata è basata sull'architettura Massively Parallel Processing (MPP). I componenti principali di Teradata sono Parsing Engine, BYNET e Access Module Processors (AMP). Il diagramma seguente mostra l'architettura di alto livello di un nodo Teradata.
Componenti di Teradata
I componenti chiave di Teradata sono i seguenti:
Node- È l'unità di base nel sistema Teradata. Ogni singolo server in un sistema Teradata è denominato Node. Un nodo è costituito dal proprio sistema operativo, CPU, memoria, copia del software Teradata RDBMS e spazio su disco. Un cabinet è costituito da uno o più nodi.
Parsing Engine- Parsing Engine è responsabile della ricezione delle query dal client e della preparazione di un piano di esecuzione efficiente. Le responsabilità del motore di analisi sono:
Ricevi la query SQL dal client
Analizza il controllo della query SQL per errori di sintassi
Verificare se l'utente ha richiesto il privilegio rispetto agli oggetti utilizzati nella query SQL
Verificare se gli oggetti utilizzati nell'SQL esistono effettivamente
Preparare il piano di esecuzione per eseguire la query SQL e passarlo a BYNET
Riceve i risultati dagli AMP e li invia al client
Message Passing Layer- Message Passing Layer chiamato BYNET, è il livello di rete nel sistema Teradata. Permette la comunicazione tra PE e AMP e anche tra i nodi. Riceve il piano di esecuzione da Parsing Engine e lo invia ad AMP. Allo stesso modo, riceve i risultati dagli AMP e li invia a Parsing Engine.
Access Module Processor (AMP)- Gli AMP, chiamati processori virtuali (vprocs), sono quelli che memorizzano e recuperano effettivamente i dati. Gli AMP ricevono i dati e il piano di esecuzione da Parsing Engine, esegue qualsiasi conversione, aggregazione, filtro, ordinamento del tipo di dati e memorizza i dati nei dischi ad essi associati. I record delle tabelle vengono distribuiti uniformemente tra gli AMP nel sistema. Ogni AMP è associato a un set di dischi su cui sono archiviati i dati. Solo quell'AMP può leggere / scrivere dati dai dischi.
Architettura di archiviazione
Quando il client esegue query per inserire record, il motore di analisi invia i record a BYNET. BYNET recupera i record e invia la riga all'AMP di destinazione. AMP archivia questi record sui propri dischi. Il diagramma seguente mostra l'architettura di archiviazione di Teradata.
Architettura di recupero
Quando il client esegue query per recuperare i record, il motore di analisi invia una richiesta a BYNET. BYNET invia la richiesta di recupero agli AMP appropriati. Quindi gli AMP cercano i loro dischi in parallelo e identificano i record richiesti e li inviano a BYNET. BYNET invia quindi i record a Parsing Engine che a sua volta li invierà al client. Di seguito è riportata l'architettura di recupero di Teradata.
Relational Database Management System (RDBMS) è un software DBMS che aiuta a interagire con i database. Usano Structured Query Language (SQL) per interagire con i dati archiviati nelle tabelle.
Banca dati
Il database è una raccolta di dati correlati logicamente. Sono accessibili da molti utenti per scopi diversi. Ad esempio, un database delle vendite contiene intere informazioni sulle vendite memorizzate in molte tabelle.
Tabelle
Le tabelle sono l'unità di base in RDBMS in cui vengono memorizzati i dati. Una tabella è una raccolta di righe e colonne. Di seguito è riportato un esempio di tabella dei dipendenti.
EmployeeNo | Nome di battesimo | Cognome | Data di nascita |
---|---|---|---|
101 | Mike | James | 1/5/1980 |
104 | Alex | Stuart | 11/6/1984 |
102 | Roberto | Williams | 3/5/1983 |
105 | Roberto | James | 12/1/1984 |
103 | Peter | Paolo | 4/1/1983 |
Colonne
Una colonna contiene dati simili. Ad esempio, la colonna Data di nascita nella tabella Impiegato contiene le informazioni sulla data di nascita per tutti i dipendenti.
Data di nascita |
---|
1/5/1980 |
11/6/1984 |
3/5/1983 |
12/1/1984 |
4/1/1983 |
Riga
Row è un'istanza di tutte le colonne. Ad esempio, nella tabella dei dipendenti una riga contiene informazioni su un singolo dipendente.
EmployeeNo | Nome di battesimo | Cognome | Data di nascita |
---|---|---|---|
101 | Mike | James | 1/5/1980 |
Chiave primaria
La chiave primaria viene utilizzata per identificare in modo univoco una riga in una tabella. Non sono consentiti valori duplicati in una colonna di chiave primaria e non possono accettare valori NULL. È un campo obbligatorio in una tabella.
Chiave esterna
Le chiavi esterne vengono utilizzate per creare una relazione tra le tabelle. Una chiave esterna in una tabella figlia è definita come chiave primaria nella tabella padre. Una tabella può avere più di una chiave esterna. Può accettare valori duplicati e anche valori nulli. Le chiavi esterne sono facoltative in una tabella.
Ogni colonna in una tabella è associata a un tipo di dati. I tipi di dati specificano il tipo di valori che verranno archiviati nella colonna. Teradata supporta diversi tipi di dati. Di seguito sono riportati alcuni dei tipi di dati utilizzati di frequente.
Tipi di dati | Lunghezza (byte) | Gamma di valori |
---|---|---|
BYTEINT | 1 | Da -128 a +127 |
PICCOLO | 2 | Da -32768 a +32767 |
NUMERO INTERO | 4 | Da -2.147.483.648 a +2147.483.647 |
BIGINT | 8 | -9.233.372.036.854.775,80 8 a +9.233.372.036.854.775,8 07 |
DECIMALE | 1-16 | |
NUMERICO | 1-16 | |
GALLEGGIANTE | 8 | Formato IEEE |
CHAR | Formato fisso | 1-64.000 |
VARCHAR | Variabile | 1-64.000 |
DATA | 4 | AAAAMMGG |
TEMPO | 6 o 8 | HHMMSS.nnnnnn or HHMMSS.nnnnnn + HHMM |
TIMESTAMP | 10 o 12 | YYMMDDHHMMSS.nnnnnn or YYMMDDHHMMSS.nnnnnn + HHMM |
Le tabelle nel modello relazionale sono definite come raccolta di dati. Sono rappresentati come righe e colonne.
Tipi di tabella
Tipi Teradata supporta diversi tipi di tabelle.
Permanent Table - Questa è la tabella predefinita e contiene i dati inseriti dall'utente e memorizza i dati in modo permanente.
Volatile Table- I dati inseriti in una tabella volatile vengono conservati solo durante la sessione utente. La tabella e i dati vengono eliminati alla fine della sessione. Queste tabelle vengono utilizzate principalmente per contenere i dati intermedi durante la trasformazione dei dati.
Global Temporary Table - La definizione di tabella temporanea globale è persistente ma i dati nella tabella vengono eliminati alla fine della sessione utente.
Derived Table- La tabella derivata contiene i risultati intermedi in una query. La loro durata è all'interno della query in cui vengono creati, utilizzati e rilasciati.
Set contro multiset
Teradata classifica le tabelle come tabelle SET o MULTISET in base a come vengono gestiti i record duplicati. Una tabella definita come tabella SET non archivia i record duplicati, mentre la tabella MULTISET può archiviare record duplicati.
Suor n | Comandi e descrizione della tabella |
---|---|
1 | Crea tabella Il comando CREATE TABLE viene utilizzato per creare tabelle in Teradata. |
2 | Alter Table Il comando ALTER TABLE viene utilizzato per aggiungere o eliminare colonne da una tabella esistente. |
3 | Drop Table Il comando DROP TABLE viene utilizzato per eliminare una tabella. |
Questo capitolo introduce i comandi SQL utilizzati per manipolare i dati memorizzati nelle tabelle Teradata.
Inserisci record
L'istruzione INSERT INTO viene utilizzata per inserire record nella tabella.
Sintassi
Di seguito è riportata la sintassi generica per INSERT INTO.
INSERT INTO <tablename>
(column1, column2, column3,…)
VALUES
(value1, value2, value3 …);
Esempio
Il seguente esempio inserisce i record nella tabella dei dipendenti.
INSERT INTO Employee (
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
)
VALUES (
101,
'Mike',
'James',
'1980-01-05',
'2005-03-27',
01
);
Una volta inserita la query precedente, è possibile utilizzare l'istruzione SELECT per visualizzare i record dalla tabella.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentNo | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
Inserisci da un'altra tabella
L'istruzione INSERT SELECT viene utilizzata per inserire record da un'altra tabella.
Sintassi
Di seguito è riportata la sintassi generica per INSERT INTO.
INSERT INTO <tablename>
(column1, column2, column3,…)
SELECT
column1, column2, column3…
FROM
<source table>;
Esempio
Il seguente esempio inserisce i record nella tabella dei dipendenti. Creare una tabella denominata Employee_Bkup con la stessa definizione di colonna della tabella Employee prima di eseguire la seguente query di inserimento.
INSERT INTO Employee_Bkup (
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
)
SELECT
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
FROM
Employee;
Quando la query precedente viene eseguita, inserirà tutti i record dalla tabella dei dipendenti nella tabella Employee_bkup.
Regole
Il numero di colonne specificato nell'elenco VALUES deve corrispondere alle colonne specificate nella clausola INSERT INTO.
I valori sono obbligatori per le colonne NOT NULL.
Se non viene specificato alcun valore, viene inserito NULL per i campi nullable.
I tipi di dati delle colonne specificati nella clausola VALUES devono essere compatibili con i tipi di dati delle colonne nella clausola INSERT.
Aggiorna record
L'istruzione UPDATE viene utilizzata per aggiornare i record dalla tabella.
Sintassi
Di seguito è riportata la sintassi generica per UPDATE.
UPDATE <tablename>
SET <columnnamme> = <new value>
[WHERE condition];
Esempio
L'esempio seguente aggiorna il reparto dei dipendenti a 03 per il dipendente 101.
UPDATE Employee
SET DepartmentNo = 03
WHERE EmployeeNo = 101;
Nell'output seguente è possibile vedere che DepartmentNo viene aggiornato da 1 a 3 per EmployeeNo 101.
SELECT Employeeno, DepartmentNo FROM Employee;
*** Query completed. One row found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo
----------- -------------
101 3
Regole
È possibile aggiornare uno o più valori della tabella.
Se la condizione WHERE non è specificata, tutte le righe della tabella sono interessate.
È possibile aggiornare una tabella con i valori di un'altra tabella.
Elimina record
L'istruzione DELETE FROM viene utilizzata per aggiornare i record dalla tabella.
Sintassi
Di seguito è riportata la sintassi generica per DELETE FROM.
DELETE FROM <tablename>
[WHERE condition];
Esempio
Il seguente esempio elimina il dipendente 101 dalla tabella Employee.
DELETE FROM Employee
WHERE EmployeeNo = 101;
Nell'output seguente, puoi vedere che il dipendente 101 è stato eliminato dalla tabella.
SELECT EmployeeNo FROM Employee;
*** Query completed. No rows found.
*** Total elapsed time was 1 second.
Regole
È possibile aggiornare uno o più record della tabella.
Se la condizione WHERE non è specificata, tutte le righe della tabella vengono eliminate.
È possibile aggiornare una tabella con i valori di un'altra tabella.
L'istruzione SELECT viene utilizzata per recuperare i record da una tabella.
Sintassi
Di seguito è riportata la sintassi di base dell'istruzione SELECT.
SELECT
column 1, column 2, .....
FROM
tablename;
Esempio
Considera la seguente tabella dei dipendenti.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentNo | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
102 | Roberto | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paolo | 21/03/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Roberto | James | 1/4/2008 | 3 | 12/1/1984 |
Di seguito è riportato un esempio di istruzione SELECT.
SELECT EmployeeNo,FirstName,LastName
FROM Employee;
Quando questa query viene eseguita, recupera le colonne EmployeeNo, FirstName e LastName dalla tabella dei dipendenti.
EmployeeNo FirstName LastName
----------- ------------------------------ ---------------------------
101 Mike James
104 Alex Stuart
102 Robert Williams
105 Robert James
103 Peter Paul
Se vuoi recuperare tutte le colonne da una tabella, puoi usare il seguente comando invece di elencare tutte le colonne.
SELECT * FROM Employee;
La query precedente recupererà tutti i record dalla tabella dei dipendenti.
Dove la clausola
La clausola WHERE viene utilizzata per filtrare i record restituiti dall'istruzione SELECT. Una condizione è associata alla clausola WHERE. Solo, vengono restituiti i record che soddisfano la condizione nella clausola WHERE.
Sintassi
Di seguito è riportata la sintassi dell'istruzione SELECT con la clausola WHERE.
SELECT * FROM tablename
WHERE[condition];
Esempio
La seguente query recupera i record in cui EmployeeNo è 101.
SELECT * FROM Employee
WHERE EmployeeNo = 101;
Quando questa query viene eseguita, restituisce i seguenti record.
EmployeeNo FirstName LastName
----------- ------------------------------ -----------------------------
101 Mike James
ORDINATO DA
Quando viene eseguita l'istruzione SELECT, le righe restituite non sono in un ordine specifico. La clausola ORDER BY viene utilizzata per disporre i record in ordine crescente / decrescente su qualsiasi colonna.
Sintassi
Di seguito è riportata la sintassi dell'istruzione SELECT con la clausola ORDER BY.
SELECT * FROM tablename
ORDER BY column 1, column 2..;
Esempio
La query seguente recupera i record dalla tabella dei dipendenti e ordina i risultati in base a FirstName.
SELECT * FROM Employee
ORDER BY FirstName;
Quando la query precedente viene eseguita, produce il seguente output.
EmployeeNo FirstName LastName
----------- ------------------------------ -----------------------------
104 Alex Stuart
101 Mike James
103 Peter Paul
102 Robert Williams
105 Robert James
RAGGRUPPA PER
La clausola GROUP BY viene utilizzata con l'istruzione SELECT e organizza record simili in gruppi.
Sintassi
Di seguito è riportata la sintassi dell'istruzione SELECT con la clausola GROUP BY.
SELECT column 1, column2 …. FROM tablename
GROUP BY column 1, column 2..;
Esempio
L'esempio seguente raggruppa i record per colonna DepartmentNo e identifica il conteggio totale di ogni reparto.
SELECT DepartmentNo,Count(*) FROM
Employee
GROUP BY DepartmentNo;
Quando la query precedente viene eseguita, produce il seguente output.
DepartmentNo Count(*)
------------ -----------
3 1
1 1
2 3
Teradata supporta i seguenti operatori logici e condizionali. Questi operatori vengono utilizzati per eseguire il confronto e combinare più condizioni.
Sintassi | Senso |
---|---|
> | Più grande di |
< | Meno di |
>= | Maggiore o uguale a |
<= | Minore o uguale a |
= | Uguale a |
BETWEEN | Se i valori rientrano nell'intervallo |
IN | Se i valori in <espressione> |
NOT IN | Se i valori non sono in <espressione> |
IS NULL | Se il valore è NULL |
IS NOT NULL | Se il valore è NON NULL |
AND | Combina più condizioni. Restituisce true solo se tutte le condizioni sono soddisfatte |
OR | Combina più condizioni. Restituisce true solo se una delle condizioni è soddisfatta. |
NOT | Inverte il significato della condizione |
FRA
Il comando BETWEEN viene utilizzato per verificare se un valore rientra in un intervallo di valori.
Esempio
Considera la seguente tabella dei dipendenti.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentNo | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
102 | Roberto | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paolo | 21/03/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Roberto | James | 1/4/2008 | 3 | 12/1/1984 |
L'esempio seguente recupera i record con i numeri dei dipendenti compresi nell'intervallo tra 101,102 e 103.
SELECT EmployeeNo, FirstName FROM
Employee
WHERE EmployeeNo BETWEEN 101 AND 103;
Quando la query precedente viene eseguita, restituisce i record dei dipendenti con un numero di dipendenti compreso tra 101 e 103.
*** Query completed. 3 rows found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName
----------- ------------------------------
101 Mike
102 Robert
103 Peter
IN
Il comando IN viene utilizzato per verificare il valore rispetto a un determinato elenco di valori.
Esempio
L'esempio seguente recupera i record con i numeri dei dipendenti in 101, 102 e 103.
SELECT EmployeeNo, FirstName FROM
Employee
WHERE EmployeeNo in (101,102,103);
La query precedente restituisce i seguenti record.
*** Query completed. 3 rows found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName
----------- ------------------------------
101 Mike
102 Robert
103 Peter
NON IN
Il comando NOT IN inverte il risultato del comando IN. Recupera i record con valori che non corrispondono con l'elenco fornito.
Esempio
L'esempio seguente recupera i record con i numeri dei dipendenti non in 101, 102 e 103.
SELECT * FROM
Employee
WHERE EmployeeNo not in (101,102,103);
La query precedente restituisce i seguenti record.
*** Query completed. 2 rows found. 6 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName LastName
----------- ------------------------------ -----------------------------
104 Alex Stuart
105 Robert James
Gli operatori SET combinano i risultati di più istruzioni SELECT. Potrebbe sembrare simile a Join, ma i join combinano colonne di più tabelle mentre gli operatori SET combinano righe di più righe.
Regole
Il numero di colonne di ciascuna istruzione SELECT dovrebbe essere lo stesso.
I tipi di dati di ogni SELECT devono essere compatibili.
ORDER BY dovrebbe essere incluso solo nell'istruzione SELECT finale.
UNIONE
L'istruzione UNION viene utilizzata per combinare i risultati di più istruzioni SELECT. Ignora i duplicati.
Sintassi
Di seguito è riportata la sintassi di base della dichiarazione UNION.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
UNION
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Esempio
Considera la tabella dei dipendenti e la tabella dei salari seguenti.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentNo | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
102 | Roberto | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paolo | 21/03/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Roberto | James | 1/4/2008 | 3 | 12/1/1984 |
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
102 | 80.000 | 6.000 | 74.000 |
103 | 90.000 | 7.000 | 83.000 |
104 | 75.000 | 5.000 | 70.000 |
La seguente query UNION combina il valore EmployeeNo dalla tabella Employee e Salary.
SELECT EmployeeNo
FROM
Employee
UNION
SELECT EmployeeNo
FROM
Salary;
Quando la query viene eseguita, produce il seguente output.
EmployeeNo
-----------
101
102
103
104
105
UNION ALL
L'istruzione UNION ALL è simile a UNION, combina i risultati di più tabelle comprese le righe duplicate.
Sintassi
Di seguito è riportata la sintassi di base dell'istruzione UNION ALL.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
UNION ALL
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Esempio
Di seguito è riportato un esempio per l'istruzione UNION ALL.
SELECT EmployeeNo
FROM
Employee
UNION ALL
SELECT EmployeeNo
FROM
Salary;
Quando la query precedente viene eseguita, produce il seguente output. Puoi vedere che restituisce anche i duplicati.
EmployeeNo
-----------
101
104
102
105
103
101
104
102
103
INTERSECT
Il comando INTERSECT viene utilizzato anche per combinare i risultati di più istruzioni SELECT. Restituisce le righe dalla prima istruzione SELECT che ha una corrispondenza corrispondente nelle seconde istruzioni SELECT. In altre parole, restituisce le righe che esistono in entrambe le istruzioni SELECT.
Sintassi
Di seguito è la sintassi di base dell'istruzione INTERSECT.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
INTERSECT
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Esempio
Di seguito è riportato un esempio di istruzione INTERSECT. Restituisce i valori EmployeeNo che esistono in entrambe le tabelle.
SELECT EmployeeNo
FROM
Employee
INTERSECT
SELECT EmployeeNo
FROM
Salary;
Quando la query precedente viene eseguita, restituisce i seguenti record. EmployeeNo 105 è escluso poiché non esiste nella tabella SALARY.
EmployeeNo
-----------
101
104
102
103
MENO / TRANNE
I comandi MINUS / EXCEPT combinano righe di più tabelle e restituiscono le righe che si trovano nella prima SELECT ma non nella seconda SELECT. Entrambi restituiscono gli stessi risultati.
Sintassi
Di seguito è riportata la sintassi di base dell'istruzione MINUS.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
MINUS
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Esempio
Di seguito è riportato un esempio di istruzione MINUS.
SELECT EmployeeNo
FROM
Employee
MINUS
SELECT EmployeeNo
FROM
Salary;
Quando questa query viene eseguita, restituisce il seguente record.
EmployeeNo
-----------
105
Teradata fornisce diverse funzioni per manipolare le stringhe. Queste funzioni sono compatibili con lo standard ANSI.
Suor n | Funzione stringa e descrizione |
---|---|
1 | || Concatena le stringhe insieme |
2 | SUBSTR Estrae una parte di una stringa (estensione Teradata) |
3 | SUBSTRING Estrae una parte di una stringa (standard ANSI) |
4 | INDEX Individua la posizione di un carattere in una stringa (estensione Teradata) |
5 | POSITION Individua la posizione di un carattere in una stringa (standard ANSI) |
6 | TRIM Taglia gli spazi vuoti da una stringa |
7 | UPPER Converte una stringa in maiuscolo |
8 | LOWER Converte una stringa in minuscolo |
Esempio
La tabella seguente elenca alcune delle funzioni di stringa con i risultati.
Funzione stringa | Risultato |
---|---|
SELEZIONA SUBSTRING ('magazzino' DA 1 PER 4) | articoli |
SELEZIONA SUBSTR ('magazzino', 1,4) | articoli |
SELEZIONA "dati" || '' || 'magazzino' | data warehouse |
SELEZIONA MAIUSCOLO ('dati') | DATI |
SELEZIONA INFERIORE ('DATI') | dati |
In questo capitolo vengono descritte le funzioni di data / ora disponibili in Teradata.
Memorizzazione della data
Le date vengono memorizzate come numero intero internamente utilizzando la seguente formula.
((YEAR - 1900) * 10000) + (MONTH * 100) + DAY
È possibile utilizzare la seguente query per verificare come vengono memorizzate le date.
SELECT CAST(CURRENT_DATE AS INTEGER);
Poiché le date vengono memorizzate come numeri interi, è possibile eseguire alcune operazioni aritmetiche su di esse. Teradata fornisce funzioni per eseguire queste operazioni.
ESTRATTO
La funzione EXTRACT estrae parti del giorno, del mese e dell'anno da un valore DATE. Questa funzione viene utilizzata anche per estrarre ore, minuti e secondi dal valore TIME / TIMESTAMP.
Esempio
I seguenti esempi mostrano come estrarre i valori Anno, Mese, Data, Ora, Minuti e secondi dai valori Data e Timestamp.
SELECT EXTRACT(YEAR FROM CURRENT_DATE);
EXTRACT(YEAR FROM Date)
-----------------------
2016
SELECT EXTRACT(MONTH FROM CURRENT_DATE);
EXTRACT(MONTH FROM Date)
------------------------
1
SELECT EXTRACT(DAY FROM CURRENT_DATE);
EXTRACT(DAY FROM Date)
------------------------
1
SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP);
EXTRACT(HOUR FROM Current TimeStamp(6))
---------------------------------------
4
SELECT EXTRACT(MINUTE FROM CURRENT_TIMESTAMP);
EXTRACT(MINUTE FROM Current TimeStamp(6))
-----------------------------------------
54
SELECT EXTRACT(SECOND FROM CURRENT_TIMESTAMP);
EXTRACT(SECOND FROM Current TimeStamp(6))
-----------------------------------------
27.140000
INTERVALLO
Teradata fornisce la funzione INTERVAL per eseguire operazioni aritmetiche sui valori DATE e TIME. Esistono due tipi di funzioni INTERVALLO.
Intervallo anno-mese
- YEAR
- ANNO AL MESE
- MONTH
Intervallo tra giorno e ora
- DAY
- GIORNO IN ORA
- GIORNO IN MINUTO
- GIORNO AL SECONDO
- HOUR
- DA ORA A MINUTO
- ORA AL SECONDO
- MINUTE
- MINUTO A SECONDO
- SECOND
Esempio
L'esempio seguente aggiunge 3 anni alla data corrente.
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03' YEAR;
Date (Date+ 3)
-------- ---------
16/01/01 19/01/01
L'esempio seguente aggiunge 3 anni e 01 mese alla data corrente.
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03-01' YEAR TO MONTH;
Date (Date+ 3-01)
-------- ------------
16/01/01 19/02/01
L'esempio seguente aggiunge 01 giorno, 05 ore e 10 minuti al timestamp corrente.
SELECT CURRENT_TIMESTAMP,CURRENT_TIMESTAMP + INTERVAL '01 05:10' DAY TO MINUTE;
Current TimeStamp(6) (Current TimeStamp(6)+ 1 05:10)
-------------------------------- --------------------------------
2016-01-01 04:57:26.360000+00:00 2016-01-02 10:07:26.360000+00:00
Teradata fornisce funzioni integrate che sono estensioni di SQL. Di seguito sono riportate le funzioni incorporate comuni.
Funzione | Risultato |
---|---|
SELEZIONA DATA; | Data -------- 16/01/01 |
SELEZIONA CURRENT_DATE; | Data -------- 16/01/01 |
SELEZIONA L'ORA; | Ora -------- 04:50:29 |
SELEZIONA CURRENT_TIME; | Ora -------- 04:50:29 |
SELEZIONA CURRENT_TIMESTAMP; | Current TimeStamp (6) -------------------------------- 2016-01-01 04: 51: 06.990000 + 00: 00 |
SELEZIONA DATABASE; | Database ------------------------------ TDUSER |
Teradata supporta funzioni aggregate comuni. Possono essere utilizzati con l'istruzione SELECT.
COUNT - Conta le righe
SUM - Riassume i valori delle colonne specificate
MAX - Restituisce il valore grande della colonna specificata
MIN - Restituisce il valore minimo della colonna specificata
AVG - Restituisce il valore medio della colonna specificata
Esempio
Considera la seguente tabella dei salari.
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
104 | 75.000 | 5.000 | 70.000 |
102 | 80.000 | 6.000 | 74.000 |
105 | 70.000 | 4.000 | 66.000 |
103 | 90.000 | 7.000 | 83.000 |
CONTARE
L'esempio seguente conta il numero di record nella tabella Salary.
SELECT count(*) from Salary;
Count(*)
-----------
5
MAX
L'esempio seguente restituisce il valore dello stipendio netto massimo del dipendente.
SELECT max(NetPay) from Salary;
Maximum(NetPay)
---------------------
83000
MIN
L'esempio seguente restituisce il valore dello stipendio netto minimo del dipendente dalla tabella Salary.
SELECT min(NetPay) from Salary;
Minimum(NetPay)
---------------------
36000
AVG
L'esempio seguente restituisce la media del valore salariale netto dei dipendenti dalla tabella.
SELECT avg(NetPay) from Salary;
Average(NetPay)
---------------------
65800
SOMMA
L'esempio seguente calcola la somma dello stipendio netto dei dipendenti da tutti i record della tabella Salary.
SELECT sum(NetPay) from Salary;
Sum(NetPay)
-----------------
329000
Questo capitolo spiega le funzioni CASE e COALESCE di Teradata.
CASE Expression
L'espressione CASE valuta ogni riga rispetto a una condizione o alla clausola WHEN e restituisce il risultato della prima corrispondenza. Se non sono presenti corrispondenze, viene restituito il risultato della parte ELSE.
Sintassi
Di seguito è riportata la sintassi dell'espressione CASE.
CASE <expression>
WHEN <expression> THEN result-1
WHEN <expression> THEN result-2
ELSE
Result-n
END
Esempio
Considera la seguente tabella Employee.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentNo | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
102 | Roberto | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paolo | 21/03/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Roberto | James | 1/4/2008 | 3 | 12/1/1984 |
L'esempio seguente valuta la colonna DepartmentNo e restituisce il valore 1 se il numero di reparto è 1; restituisce 2 se il numero di reparto è 3; altrimenti restituisce il valore come reparto non valido.
SELECT
EmployeeNo,
CASE DepartmentNo
WHEN 1 THEN 'Admin'
WHEN 2 THEN 'IT'
ELSE 'Invalid Dept'
END AS Department
FROM Employee;
Quando la query precedente viene eseguita, produce il seguente output.
*** Query completed. 5 rows found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo Department
----------- ------------
101 Admin
104 IT
102 IT
105 Invalid Dept
103 IT
L'espressione CASE sopra può anche essere scritta nella seguente forma che produrrà lo stesso risultato di cui sopra.
SELECT
EmployeeNo,
CASE
WHEN DepartmentNo = 1 THEN 'Admin'
WHEN DepartmentNo = 2 THEN 'IT'
ELSE 'Invalid Dept'
END AS Department
FROM Employee;
COALESCE
COALESCE è un'istruzione che restituisce il primo valore non nullo dell'espressione. Restituisce NULL se tutti gli argomenti dell'espressione restituiscono NULL. Di seguito è riportata la sintassi.
Sintassi
COALESCE(expression 1, expression 2, ....)
Esempio
SELECT
EmployeeNo,
COALESCE(dept_no, 'Department not found')
FROM
employee;
NULLIF
L'istruzione NULLIF restituisce NULL se gli argomenti sono uguali.
Sintassi
Di seguito è riportata la sintassi dell'istruzione NULLIF.
NULLIF(expression 1, expression 2)
Esempio
L'esempio seguente restituisce NULL se DepartmentNo è uguale a 3. In caso contrario, restituisce il valore DepartmentNo.
SELECT
EmployeeNo,
NULLIF(DepartmentNo,3) AS department
FROM Employee;
La query precedente restituisce i seguenti record. Puoi vedere che il dipendente 105 ha il dipartimento n. come NULL.
*** Query completed. 5 rows found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo department
----------- ------------------
101 1
104 2
102 2
105 ?
103 2
L'indice primario viene utilizzato per specificare dove risiedono i dati in Teradata. Viene utilizzato per specificare quale AMP ottiene la riga di dati. Ogni tabella in Teradata deve avere un indice primario definito. Se l'indice primario non è definito, Teradata assegna automaticamente l'indice primario. L'indice primario fornisce il modo più veloce per accedere ai dati. Una primaria può avere un massimo di 64 colonne.
L'indice primario viene definito durante la creazione di una tabella. Esistono 2 tipi di indici primari.
- Indice primario univoco (UPI)
- Indice primario non univoco (NUPI)
Indice primario univoco (UPI)
Se la tabella è definita per avere UPI, la colonna considerata come UPI non dovrebbe avere valori duplicati. Se vengono inseriti valori duplicati, verranno rifiutati.
Crea indice primario univoco
L'esempio seguente crea la tabella Salary con la colonna EmployeeNo come indice primario univoco.
CREATE SET TABLE Salary (
EmployeeNo INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
UNIQUE PRIMARY INDEX(EmployeeNo);
Indice primario non univoco (NUPI)
Se la tabella è definita per avere NUPI, la colonna considerata come UPI può accettare valori duplicati.
Crea indice primario non univoco
L'esempio seguente crea la tabella dei conti dei dipendenti con la colonna EmployeeNo come indice primario non univoco. EmployeeNo è definito come Indice primario non univoco poiché un dipendente può avere più account nella tabella; uno per conto stipendio e un altro per conto rimborso.
CREATE SET TABLE Employee _Accounts (
EmployeeNo INTEGER,
employee_bank_account_type BYTEINT.
employee_bank_account_number INTEGER,
employee_bank_name VARCHAR(30),
employee_bank_city VARCHAR(30)
)
PRIMARY INDEX(EmployeeNo);
Join viene utilizzato per combinare i record di più di una tabella. Le tabelle vengono unite in base alle colonne / ai valori comuni di queste tabelle.
Sono disponibili diversi tipi di join.
- Inner Join
- Join esterno sinistro
- Right Outer Join
- Join esterno completo
- Self Join
- Cross Join
- Cartesian Production Join
INNER JOIN
Inner Join combina i record di più tabelle e restituisce i valori presenti in entrambe le tabelle.
Sintassi
Di seguito è riportata la sintassi dell'istruzione INNER JOIN.
SELECT col1, col2, col3….
FROM
Table-1
INNER JOIN
Table-2
ON (col1 = col2)
<WHERE condition>;
Esempio
Considera la tabella dei dipendenti e la tabella dei salari seguenti.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentNo | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
102 | Roberto | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paolo | 21/03/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Roberto | James | 1/4/2008 | 3 | 12/1/1984 |
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
102 | 80.000 | 6.000 | 74.000 |
103 | 90.000 | 7.000 | 83.000 |
104 | 75.000 | 5.000 | 70.000 |
La query seguente unisce la tabella Employee e la tabella Salary nella colonna comune EmployeeNo. A ciascuna tabella viene assegnato un alias A e B e alle colonne viene fatto riferimento con l'alias corretto.
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
INNER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo);
Quando la query precedente viene eseguita, restituisce i seguenti record. L'impiegato 105 non è incluso nel risultato poiché non ha record corrispondenti nella tabella Salario.
*** Query completed. 4 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo NetPay
----------- ------------ -----------
101 1 36000
102 2 74000
103 2 83000
104 2 70000
OUTER JOIN
LEFT OUTER JOIN e RIGHT OUTER JOIN combinano anche i risultati di più tabelle.
LEFT OUTER JOIN restituisce tutti i record dalla tabella di sinistra e restituisce solo i record corrispondenti dalla tabella di destra.
RIGHT OUTER JOIN restituisce tutti i record dalla tabella di destra e restituisce solo le righe corrispondenti dalla tabella di sinistra.
FULL OUTER JOINcombina i risultati delle UNITE ESTERNE SINISTRA e ESTERNA DESTRA. Restituisce righe corrispondenti e non corrispondenti dalle tabelle unite.
Sintassi
Di seguito è riportata la sintassi dell'istruzione OUTER JOIN. È necessario utilizzare una delle opzioni da LEFT OUTER JOIN, RIGHT OUTER JOIN o FULL OUTER JOIN.
SELECT col1, col2, col3….
FROM
Table-1
LEFT OUTER JOIN/RIGHT OUTER JOIN/FULL OUTER JOIN
Table-2
ON (col1 = col2)
<WHERE condition>;
Esempio
Considera il seguente esempio della query LEFT OUTER JOIN. Restituisce tutti i record dalla tabella Employee e i record corrispondenti dalla tabella Salary.
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
LEFT OUTER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo)
ORDER BY A.EmployeeNo;
Quando la query precedente viene eseguita, produce il seguente output. Per il dipendente 105, il valore NetPay è NULL, poiché non ha record corrispondenti nella tabella Salary.
*** Query completed. 5 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo NetPay
----------- ------------ -----------
101 1 36000
102 2 74000
103 2 83000
104 2 70000
105 3 ?
CROSS JOIN
Cross Join unisce ogni riga della tabella di sinistra a ogni riga della tabella di destra.
Sintassi
Di seguito è riportata la sintassi dell'istruzione CROSS JOIN.
SELECT A.EmployeeNo, A.DepartmentNo, B.EmployeeNo,B.NetPay
FROM
Employee A
CROSS JOIN
Salary B
WHERE A.EmployeeNo = 101
ORDER BY B.EmployeeNo;
Quando la query precedente viene eseguita, produce il seguente output. L'impiegato n. 101 dalla tabella Impiegato è unito a ogni record dalla tabella Salario.
*** Query completed. 4 rows found. 4 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo DepartmentNo EmployeeNo NetPay
----------- ------------ ----------- -----------
101 1 101 36000
101 1 104 70000
101 1 102 74000
101 1 103 83000
Una sottoquery restituisce i record di una tabella in base ai valori di un'altra tabella. È una query SELECT all'interno di un'altra query. La query SELECT chiamata come query interna viene eseguita per prima e il risultato viene utilizzato dalla query esterna. Alcune delle sue caratteristiche salienti sono:
Una query può avere più sottoquery e le sottoquery possono contenere un'altra sottoquery.
Le sottoquery non restituiscono record duplicati.
Se la sottoquery restituisce un solo valore, è possibile utilizzare l'operatore = per utilizzarlo con la query esterna. Se restituisce più valori è possibile utilizzare IN o NOT IN.
Sintassi
Di seguito è riportata la sintassi generica delle sottoquery.
SELECT col1, col2, col3,…
FROM
Outer Table
WHERE col1 OPERATOR ( Inner SELECT Query);
Esempio
Considera la seguente tabella degli stipendi.
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
102 | 80.000 | 6.000 | 74.000 |
103 | 90.000 | 7.000 | 83.000 |
104 | 75.000 | 5.000 | 70.000 |
La seguente query identifica il numero del dipendente con lo stipendio più alto. Il SELECT interno esegue la funzione di aggregazione per restituire il valore NetPay massimo e la query SELECT esterna utilizza questo valore per restituire il record del dipendente con questo valore.
SELECT EmployeeNo, NetPay
FROM Salary
WHERE NetPay =
(SELECT MAX(NetPay)
FROM Salary);
Quando questa query viene eseguita, produce il seguente output.
*** Query completed. One row found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo NetPay
----------- -----------
103 83000
Teradata supporta i seguenti tipi di tabella per contenere dati temporanei.
- Tabella derivata
- Tabella volatile
- Tabella temporanea globale
Tabella derivata
Le tabelle derivate vengono create, utilizzate e rilasciate all'interno di una query. Questi vengono utilizzati per memorizzare risultati intermedi all'interno di una query.
Esempio
L'esempio seguente crea una tabella derivata EmpSal con record di dipendenti con stipendio maggiore di 75000.
SELECT
Emp.EmployeeNo,
Emp.FirstName,
Empsal.NetPay
FROM
Employee Emp,
(select EmployeeNo , NetPay
from Salary
where NetPay >= 75000) Empsal
where Emp.EmployeeNo = Empsal.EmployeeNo;
Quando viene eseguita la query precedente, restituisce i dipendenti con uno stipendio superiore a 75000.
*** Query completed. One row found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName NetPay
----------- ------------------------------ -----------
103 Peter 83000
Tabella volatile
Le tabelle volatili vengono create, utilizzate e rilasciate all'interno di una sessione utente. La loro definizione non è memorizzata nel dizionario dei dati. Contengono i dati intermedi della query che viene utilizzata di frequente. Di seguito è riportata la sintassi.
Sintassi
CREATE [SET|MULTISET] VOALTILE TABLE tablename
<table definitions>
<column definitions>
<index definitions>
ON COMMIT [DELETE|PRESERVE] ROWS
Esempio
CREATE VOLATILE TABLE dept_stat (
dept_no INTEGER,
avg_salary INTEGER,
max_salary INTEGER,
min_salary INTEGER
)
PRIMARY INDEX(dept_no)
ON COMMIT PRESERVE ROWS;
Quando la query precedente viene eseguita, produce il seguente output.
*** Table has been created.
*** Total elapsed time was 1 second.
Tabella temporanea globale
La definizione di tabella temporanea globale è memorizzata nel dizionario dei dati e può essere utilizzata da molti utenti / sessioni. Ma i dati caricati nella tabella temporanea globale vengono conservati solo durante la sessione. È possibile materializzare fino a 2000 tabelle temporanee globali per sessione. Di seguito è riportata la sintassi.
Sintassi
CREATE [SET|MULTISET] GLOBAL TEMPORARY TABLE tablename
<table definitions>
<column definitions>
<index definitions>
Esempio
CREATE SET GLOBAL TEMPORARY TABLE dept_stat (
dept_no INTEGER,
avg_salary INTEGER,
max_salary INTEGER,
min_salary INTEGER
)
PRIMARY INDEX(dept_no);
Quando la query precedente viene eseguita, produce il seguente output.
*** Table has been created.
*** Total elapsed time was 1 second.
Ci sono tre tipi di spazi disponibili a Teradata.
Spazio permanente
Lo spazio permanente è la quantità massima di spazio disponibile per l'utente / database per contenere le righe di dati. Le tabelle permanenti, i journal, le tabelle di fallback e le sotto-tabelle degli indici secondari utilizzano uno spazio permanente.
Lo spazio permanente non è preallocato per il database / utente. Sono semplicemente definiti come la quantità massima di spazio che il database / utente può utilizzare. La quantità di spazio permanente viene divisa per il numero di AMP. Ogni volta che il limite di AMP viene superato, viene generato un messaggio di errore.
Spazio bobina
Lo spazio di spool è lo spazio permanente inutilizzato che viene utilizzato dal sistema per conservare i risultati intermedi della query SQL. Gli utenti senza spazio di spool non possono eseguire alcuna query.
Simile allo spazio permanente, lo spazio di spool definisce la quantità massima di spazio che l'utente può utilizzare. Lo spazio di spool viene diviso per il numero di AMP. Ogni volta che il limite di AMP viene superato, l'utente riceverà un errore di spazio di spool.
Spazio temporaneo
Lo spazio temporaneo è lo spazio permanente inutilizzato utilizzato dalle tabelle temporanee globali. Lo spazio temporaneo è anche diviso per il numero di AMP.
Una tabella può contenere un solo indice primario. Più spesso, ti imbatterai in scenari in cui la tabella contiene altre colonne, utilizzando le quali si accede frequentemente ai dati. Teradata eseguirà la scansione completa della tabella per tali query. Gli indici secondari risolvono questo problema.
Gli indici secondari sono un percorso alternativo per accedere ai dati. Esistono alcune differenze tra l'indice primario e l'indice secondario.
L'indice secondario non è coinvolto nella distribuzione dei dati.
I valori dell'indice secondario vengono memorizzati in tabelle secondarie. Queste tabelle sono costruite in tutti gli AMP.
Gli indici secondari sono facoltativi.
Possono essere creati durante la creazione della tabella o dopo la creazione di una tabella.
Occupano spazio aggiuntivo poiché creano sotto-tabelle e richiedono anche manutenzione poiché le sotto-tabelle devono essere aggiornate per ogni nuova riga.
Esistono due tipi di indici secondari:
- Indice secondario univoco (USI)
- Indice secondario non univoco (NUSI)
Indice secondario univoco (USI)
Un indice secondario univoco consente solo valori univoci per le colonne definite come USI. L'accesso alla riga dall'USI è un'operazione a due ampere.
Crea un indice secondario univoco
L'esempio seguente crea l'USI nella colonna EmployeeNo della tabella dei dipendenti.
CREATE UNIQUE INDEX(EmployeeNo) on employee;
Indice secondario non univoco (NUSI)
Un indice secondario non univoco consente valori duplicati per le colonne definite come NUSI. L'accesso alla riga tramite NUSI è un'operazione su tutti gli amplificatori.
Crea indice secondario non univoco
Il seguente esempio crea NUSI sulla colonna FirstName della tabella dei dipendenti.
CREATE INDEX(FirstName) on Employee;
L'ottimizzatore di Teradata presenta una strategia di esecuzione per ogni query SQL. Questa strategia di esecuzione si basa sulle statistiche raccolte sulle tabelle utilizzate all'interno della query SQL. Le statistiche sulla tabella vengono raccolte utilizzando il comando RACCOGLI STATISTICHE. Optimizer richiede informazioni sull'ambiente e dati demografici per elaborare una strategia di esecuzione ottimale.
Informazioni sull'ambiente
- Numero di nodi, AMP e CPU
- Quantità di memoria
Dati demografici
- Numero di righe
- Dimensione riga
- Intervallo di valori nella tabella
- Numero di righe per valore
- Numero di null
Esistono tre approcci per raccogliere statistiche sul tavolo.
- Campionamento AMP casuale
- Raccolta completa delle statistiche
- Utilizzando l'opzione SAMPLE
Raccolta di statistiche
Il comando COLLECT STATISTICS viene utilizzato per raccogliere statistiche su una tabella.
Sintassi
Di seguito è riportata la sintassi di base per raccogliere statistiche su una tabella.
COLLECT [SUMMARY] STATISTICS
INDEX (indexname) COLUMN (columnname)
ON <tablename>;
Esempio
L'esempio seguente raccoglie le statistiche sulla colonna EmployeeNo della tabella Employee.
COLLECT STATISTICS COLUMN(EmployeeNo) ON Employee;
Quando la query precedente viene eseguita, produce il seguente output.
*** Update completed. 2 rows changed.
*** Total elapsed time was 1 second.
Visualizzazione delle statistiche
È possibile visualizzare le statistiche raccolte utilizzando il comando HELP STATISTICS.
Sintassi
Di seguito è riportata la sintassi per visualizzare le statistiche raccolte.
HELP STATISTICS <tablename>;
Esempio
Di seguito è riportato un esempio per visualizzare le statistiche raccolte sulla tabella Employee.
HELP STATISTICS employee;
Quando la query precedente viene eseguita, produce il seguente risultato.
Date Time Unique Values Column Names
-------- -------- -------------------- -----------------------
16/01/01 08:07:04 5 *
16/01/01 07:24:16 3 DepartmentNo
16/01/01 08:07:04 5 EmployeeNo
La compressione viene utilizzata per ridurre lo spazio di archiviazione utilizzato dalle tabelle. In Teradata, la compressione può comprimere fino a 255 valori distinti, incluso NULL. Poiché lo spazio di archiviazione è ridotto, Teradata può archiviare più record in un blocco. Ciò si traduce in un tempo di risposta alle query migliorato poiché qualsiasi operazione di I / O può elaborare più righe per blocco. La compressione può essere aggiunta durante la creazione della tabella utilizzando CREATE TABLE o dopo la creazione della tabella utilizzando il comando ALTER TABLE.
Limitazioni
- È possibile comprimere solo 255 valori per colonna.
- La colonna Indice primario non può essere compressa.
- Le tabelle volatili non possono essere compresse.
Compressione multivalore (MVC)
La tabella seguente comprime il campo DepatmentNo per i valori 1, 2 e 3. Quando la compressione viene applicata a una colonna, i valori per questa colonna non vengono memorizzati con la riga. I valori vengono invece memorizzati nell'intestazione della tabella in ogni AMP e solo i bit di presenza vengono aggiunti alla riga per indicare il valore.
CREATE SET TABLE employee (
EmployeeNo integer,
FirstName CHAR(30),
LastName CHAR(30),
BirthDate DATE FORMAT 'YYYY-MM-DD-',
JoinedDate DATE FORMAT 'YYYY-MM-DD-',
employee_gender CHAR(1),
DepartmentNo CHAR(02) COMPRESS(1,2,3)
)
UNIQUE PRIMARY INDEX(EmployeeNo);
La compressione multivalore può essere utilizzata quando si dispone di una colonna in una tabella di grandi dimensioni con valori finiti.
Il comando EXPLAIN restituisce il piano di esecuzione del motore di analisi in inglese. Può essere utilizzato con qualsiasi istruzione SQL tranne su un altro comando EXPLAIN. Quando una query è preceduta dal comando EXPLAIN, il piano di esecuzione del Parsing Engine viene restituito all'utente anziché AMP.
Esempi di EXPLAIN
Considera la tabella Employee con la seguente definizione.
CREATE SET TABLE EMPLOYEE,FALLBACK (
EmployeeNo INTEGER,
FirstName VARCHAR(30),
LastName VARCHAR(30),
DOB DATE FORMAT 'YYYY-MM-DD',
JoinedDate DATE FORMAT 'YYYY-MM-DD',
DepartmentNo BYTEINT
)
UNIQUE PRIMARY INDEX ( EmployeeNo );
Di seguito vengono forniti alcuni esempi di piano EXPLAIN.
Scansione tabella completa (FTS)
Quando nessuna condizione è specificata nell'istruzione SELECT, l'ottimizzatore può scegliere di utilizzare la scansione completa della tabella in cui si accede a ciascuna riga della tabella.
Esempio
Di seguito è una query di esempio in cui l'ottimizzatore può scegliere FTS.
EXPLAIN SELECT * FROM employee;
Quando la query precedente viene eseguita, produce il seguente output. Come si può vedere, l'ottimizzatore sceglie di accedere a tutti gli AMP e a tutte le righe all'interno dell'AMP.
1) First, we lock a distinct TDUSER."pseudo table" for read on a
RowHash to prevent global deadlock for TDUSER.employee.
2) Next, we lock TDUSER.employee for read.
3) We do an all-AMPs RETRIEVE step from TDUSER.employee by way of an
all-rows scan with no residual conditions into Spool 1
(group_amps), which is built locally on the AMPs. The size of
Spool 1 is estimated with low confidence to be 2 rows (116 bytes).
The estimated time for this step is 0.03 seconds.
4) Finally, we send out an END TRANSACTION step to all AMPs involved
in processing the request.
→ The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.03 seconds.
Indice primario univoco
Quando si accede alle righe utilizzando l'indice primario univoco, si tratta di un'operazione AMP.
EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;
Quando la query precedente viene eseguita, produce il seguente output. Come si può vedere, si tratta di un recupero AMP singolo e l'ottimizzatore utilizza l'indice primario univoco per accedere alla riga.
1) First, we do a single-AMP RETRIEVE step from TDUSER.employee by
way of the unique primary index "TDUSER.employee.EmployeeNo = 101"
with no residual conditions. The estimated time for this step is
0.01 seconds.
→ The row is sent directly back to the user as the result of
statement 1. The total estimated time is 0.01 seconds.
Indice secondario univoco
Quando si accede alle righe utilizzando l'indice secondario univoco, è un'operazione a due amp.
Esempio
Considera la tabella Salario con la seguente definizione.
CREATE SET TABLE SALARY,FALLBACK (
EmployeeNo INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
PRIMARY INDEX ( EmployeeNo )
UNIQUE INDEX (EmployeeNo);
Considera la seguente istruzione SELECT.
EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;
Quando la query precedente viene eseguita, produce il seguente output. Come si può vedere, l'ottimizzatore recupera la riga in un'operazione a due amplificatori utilizzando un indice secondario univoco.
1) First, we do a two-AMP RETRIEVE step from TDUSER.Salary
by way of unique index # 4 "TDUSER.Salary.EmployeeNo =
101" with no residual conditions. The estimated time for this
step is 0.01 seconds.
→ The row is sent directly back to the user as the result of
statement 1. The total estimated time is 0.01 seconds.
Termini aggiuntivi
Di seguito è riportato l'elenco dei termini comunemente visualizzati nel piano EXPLAIN.
... (Last Use) …
Un file di spool non è più necessario e verrà rilasciato al termine di questo passaggio.
... with no residual conditions …
Tutte le condizioni applicabili sono state applicate alle righe.
... END TRANSACTION …
I blocchi delle transazioni vengono rilasciati e le modifiche vengono salvate.
... eliminating duplicate rows ...
Le righe duplicate esistono solo nei file di spool, non nelle tabelle impostate. Esecuzione di un'operazione DISTINCT.
... by way of a traversal of index #n extracting row ids only …
Viene creato un file di spool contenente gli ID riga trovati in un indice secondario (indice #n)
... we do a SMS (set manipulation step) …
Combinazione di righe utilizzando un operatore UNION, MINUS o INTERSECT.
... which is redistributed by hash code to all AMPs.
Ridistribuzione dei dati in preparazione per un join.
... which is duplicated on all AMPs.
Duplicazione dei dati dalla tabella più piccola (in termini di SPOOL) in preparazione per un join.
... (one_AMP) or (group_AMPs)
Indica che verrà utilizzato un AMP o un sottoinsieme di AMP invece di tutti gli AMP.
Una riga viene assegnata a un particolare AMP in base al valore dell'indice primario. Teradata utilizza l'algoritmo di hashing per determinare quale AMP ottiene la riga.
Di seguito è riportato un diagramma di alto livello sull'algoritmo di hashing.
Di seguito sono riportati i passaggi per inserire i dati.
Il cliente invia una richiesta.
Il parser riceve la query e passa il valore PI del record all'algoritmo di hashing.
L'algoritmo di hashing esegue l'hashing del valore dell'indice primario e restituisce un numero a 32 bit, denominato Row Hash.
I bit di ordine superiore della riga hash (i primi 16 bit) vengono utilizzati per identificare la voce della mappa hash. La mappa hash contiene un AMP #. La mappa hash è un array di bucket che contiene AMP # specifici.
BYNET invia i dati all'AMP identificato.
AMP utilizza l'hash della riga a 32 bit per individuare la riga all'interno del proprio disco.
Se è presente un record con lo stesso hash di riga, incrementa l'ID di unicità che è un numero a 32 bit. Per il nuovo hash di riga, l'ID di unicità viene assegnato come 1 e incrementato ogni volta che viene inserito un record con lo stesso hash di riga.
La combinazione di hash di riga e ID di unicità viene chiamata come ID di riga.
L'ID riga è il prefisso di ogni record nel disco.
Ogni riga della tabella nell'AMP è ordinata logicamente in base ai rispettivi ID riga.
Come vengono archiviate le tabelle
Le tabelle vengono ordinate in base al rispettivo ID riga (hash riga + ID univocità) e quindi archiviate all'interno degli AMP. L'ID riga viene memorizzato con ogni riga di dati.
Row Hash | ID di unicità | EmployeeNo | Nome di battesimo | Cognome |
---|---|---|---|---|
2A01 2611 | 0000 0001 | 101 | Mike | James |
2A01 2612 | 0000 0001 | 104 | Alex | Stuart |
2A01 2613 | 0000 0001 | 102 | Roberto | Williams |
2A01 2614 | 0000 0001 | 105 | Roberto | James |
2A01 2615 | 0000 0001 | 103 | Peter | Paolo |
JOIN INDEX è una vista materializzata. La sua definizione viene memorizzata in modo permanente ei dati vengono aggiornati ogni volta che vengono aggiornate le tabelle di base a cui fa riferimento l'indice di join. JOIN INDEX può contenere una o più tabelle e contenere anche dati pre-aggregati. Gli indici di join vengono utilizzati principalmente per migliorare le prestazioni.
Sono disponibili diversi tipi di indici di join.
- Indice Single Table Join (STJI)
- Indice di unione di più tabelle (MTJI)
- Indice aggregato di join (AJI)
Indice join tabella singola
L'indice Single Table Join consente di partizionare una tabella di grandi dimensioni in base alle diverse colonne dell'indice primario rispetto a quella della tabella di base.
Sintassi
Di seguito è riportata la sintassi di un JOIN INDEX.
CREATE JOIN INDEX <index name>
AS
<SELECT Query>
<Index Definition>;
Esempio
Considera le seguenti tabelle dei dipendenti e dei salari.
CREATE SET TABLE EMPLOYEE,FALLBACK (
EmployeeNo INTEGER,
FirstName VARCHAR(30) ,
LastName VARCHAR(30) ,
DOB DATE FORMAT 'YYYY-MM-DD',
JoinedDate DATE FORMAT 'YYYY-MM-DD',
DepartmentNo BYTEINT
)
UNIQUE PRIMARY INDEX ( EmployeeNo );
CREATE SET TABLE SALARY,FALLBACK (
EmployeeNo INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
PRIMARY INDEX ( EmployeeNo )
UNIQUE INDEX (EmployeeNo);
Di seguito è riportato un esempio che crea un indice di join denominato Employee_JI sulla tabella Employee.
CREATE JOIN INDEX Employee_JI
AS
SELECT EmployeeNo,FirstName,LastName,
BirthDate,JoinedDate,DepartmentNo
FROM Employee
PRIMARY INDEX(FirstName);
Se l'utente invia una query con una clausola WHERE su EmployeeNo, il sistema interrogherà la tabella Employee utilizzando l'indice primario univoco. Se l'utente interroga la tabella dei dipendenti utilizzando nome_impiegato, il sistema può accedere all'indice di join Employee_JI utilizzando nome_impiegato. Le righe dell'indice di join vengono sottoposte ad hashing nella colonna dipendente_name. Se l'indice di join non è definito e il nome_impiegato non è definito come indice secondario, il sistema eseguirà la scansione completa della tabella per accedere alle righe che richiede tempo.
È possibile eseguire il seguente piano EXPLAIN e verificare il piano di ottimizzazione. Nell'esempio seguente è possibile vedere che l'ottimizzatore utilizza l'indice di join anziché la tabella Employee di base quando la tabella esegue una query utilizzando la colonna Employee_Name.
EXPLAIN SELECT * FROM EMPLOYEE WHERE FirstName='Mike';
*** Help information returned. 8 rows.
*** Total elapsed time was 1 second.
Explanation
------------------------------------------------------------------------
1) First, we do a single-AMP RETRIEVE step from EMPLOYEE_JI by
way of the primary index "EMPLOYEE_JI.FirstName = 'Mike'"
with no residual conditions into Spool 1 (one-amp), which is built
locally on that AMP. The size of Spool 1 is estimated with low
confidence to be 2 rows (232 bytes). The estimated time for this
step is 0.02 seconds.
→ The contents of Spool 1 are sent back to the user as the result of
statement 1. The total estimated time is 0.02 seconds.
Indice di unione di più tabelle
Un indice di join multi-tabella viene creato unendo più di una tabella. L'indice di join multi-tabella può essere utilizzato per archiviare il set di risultati delle tabelle unite di frequente per migliorare le prestazioni.
Esempio
Il seguente esempio crea un JOIN INDEX denominato Employee_Salary_JI unendo le tabelle Employee e Salary.
CREATE JOIN INDEX Employee_Salary_JI
AS
SELECT a.EmployeeNo,a.FirstName,a.LastName,
a.BirthDate,a.JoinedDate,a.DepartmentNo,b.Gross,b.Deduction,b.NetPay
FROM Employee a
INNER JOIN Salary b
ON(a.EmployeeNo = b.EmployeeNo)
PRIMARY INDEX(FirstName);
Ogni volta che le tabelle di base Employee o Salary vengono aggiornate, viene aggiornato automaticamente anche l'indice di join Employee_Salary_JI. Se si esegue una query che unisce le tabelle Employee e Salary, l'ottimizzatore può scegliere di accedere ai dati direttamente da Employee_Salary_JI invece di unirsi alle tabelle. Il piano EXPLAIN sulla query può essere utilizzato per verificare se l'ottimizzatore sceglierà la tabella di base o l'indice di join.
Indice di join aggregato
Se una tabella viene aggregata in modo coerente su determinate colonne, è possibile definire l'indice di join aggregato sulla tabella per migliorare le prestazioni. Una limitazione dell'indice di join aggregato è che supporta solo le funzioni SUM e COUNT.
Esempio
Nell'esempio seguente Employee and Salary viene unito per identificare lo stipendio totale per reparto.
CREATE JOIN INDEX Employee_Salary_JI
AS
SELECT a.DepartmentNo,SUM(b.NetPay) AS TotalPay
FROM Employee a
INNER JOIN Salary b
ON(a.EmployeeNo = b.EmployeeNo)
GROUP BY a.DepartmentNo
Primary Index(DepartmentNo);
Le viste sono oggetti di database creati dalla query. Le viste possono essere costruite utilizzando una singola tabella o più tabelle tramite l'unione. La loro definizione è memorizzata in modo permanente nel dizionario dei dati ma non memorizzano la copia dei dati. I dati per la vista vengono creati dinamicamente.
Una vista può contenere un sottoinsieme di righe della tabella o un sottoinsieme di colonne della tabella.
Crea una vista
Le viste vengono create utilizzando l'istruzione CREATE VIEW.
Sintassi
Di seguito è riportata la sintassi per la creazione di una vista.
CREATE/REPLACE VIEW <viewname>
AS
<select query>;
Esempio
Considera la seguente tabella Employee.
EmployeeNo | Nome di battesimo | Cognome | Data di nascita |
---|---|---|---|
101 | Mike | James | 1/5/1980 |
104 | Alex | Stuart | 11/6/1984 |
102 | Roberto | Williams | 3/5/1983 |
105 | Roberto | James | 12/1/1984 |
103 | Peter | Paolo | 4/1/1983 |
L'esempio seguente crea una visualizzazione sulla tabella Employee.
CREATE VIEW Employee_View
AS
SELECT
EmployeeNo,
FirstName,
LastName,
FROM
Employee;
Usare le viste
È possibile utilizzare la normale istruzione SELECT per recuperare i dati da Views.
Esempio
L'esempio seguente recupera i record da Employee_View;
SELECT EmployeeNo, FirstName, LastName FROM Employee_View;
Quando la query precedente viene eseguita, produce il seguente output.
*** Query completed. 5 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName LastName
----------- ------------------------------ ---------------------------
101 Mike James
104 Alex Stuart
102 Robert Williams
105 Robert James
103 Peter Paul
Modifica delle viste
Una vista esistente può essere modificata utilizzando l'istruzione REPLACE VIEW.
Di seguito è riportata la sintassi per modificare una visualizzazione.
REPLACE VIEW <viewname>
AS
<select query>;
Esempio
L'esempio seguente modifica la visualizzazione Employee_View per l'aggiunta di colonne aggiuntive.
REPLACE VIEW Employee_View
AS
SELECT
EmployeeNo,
FirstName,
BirthDate,
JoinedDate
DepartmentNo
FROM
Employee;
Drop View
Una vista esistente può essere eliminata utilizzando l'istruzione DROP VIEW.
Sintassi
Di seguito è riportata la sintassi di DROP VIEW.
DROP VIEW <viewname>;
Esempio
Di seguito è riportato un esempio per eliminare la visualizzazione Employee_View.
DROP VIEW Employee_View;
Vantaggi delle viste
Le viste forniscono un ulteriore livello di sicurezza limitando le righe o le colonne di una tabella.
Gli utenti possono avere accesso solo alle visualizzazioni invece che alle tabelle di base.
Semplifica l'uso di più tabelle unendole prima utilizzando le viste.
La macro è un insieme di istruzioni SQL che vengono memorizzate ed eseguite chiamando il nome della macro. La definizione di macro è archiviata nel dizionario dei dati. Gli utenti necessitano solo del privilegio EXEC per eseguire la macro. Gli utenti non necessitano di privilegi separati sugli oggetti del database utilizzati all'interno della Macro. Le istruzioni macro vengono eseguite come una singola transazione. Se una delle istruzioni SQL in Macro non riesce, viene eseguito il rollback di tutte le istruzioni. Le macro possono accettare parametri. Le macro possono contenere istruzioni DDL, ma questa dovrebbe essere l'ultima istruzione in Macro.
Crea macro
Le macro vengono create utilizzando l'istruzione CREATE MACRO.
Sintassi
Di seguito è riportata la sintassi generica del comando CREATE MACRO.
CREATE MACRO <macroname> [(parameter1, parameter2,...)] (
<sql statements>
);
Esempio
Considera la seguente tabella Employee.
EmployeeNo | Nome di battesimo | Cognome | Data di nascita |
---|---|---|---|
101 | Mike | James | 1/5/1980 |
104 | Alex | Stuart | 11/6/1984 |
102 | Roberto | Williams | 3/5/1983 |
105 | Roberto | James | 12/1/1984 |
103 | Peter | Paolo | 4/1/1983 |
L'esempio seguente crea una macro chiamata Get_Emp. Contiene un'istruzione select per recuperare i record dalla tabella dei dipendenti.
CREATE MACRO Get_Emp AS (
SELECT
EmployeeNo,
FirstName,
LastName
FROM
employee
ORDER BY EmployeeNo;
);
Esecuzione di macro
Le macro vengono eseguite utilizzando il comando EXEC.
Sintassi
Di seguito è riportata la sintassi del comando EXECUTE MACRO.
EXEC <macroname>;
Esempio
L'esempio seguente esegue i nomi delle macro Get_Emp; Quando viene eseguito il seguente comando, recupera tutti i record dalla tabella dei dipendenti.
EXEC Get_Emp;
*** Query completed. 5 rows found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName LastName
----------- ------------------------------ ---------------------------
101 Mike James
102 Robert Williams
103 Peter Paul
104 Alex Stuart
105 Robert James
Macro parametrizzate
Le macro Teradata possono accettare parametri. All'interno di una Macro, questi parametri sono referenziati con; (punto e virgola).
Di seguito è riportato un esempio di una macro che accetta parametri.
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS (
SELECT
EmployeeNo,
NetPay
FROM
Salary
WHERE EmployeeNo = :EmployeeNo;
);
Esecuzione di macro con parametri
Le macro vengono eseguite utilizzando il comando EXEC. È necessario il privilegio EXEC per eseguire le macro.
Sintassi
Di seguito è riportata la sintassi dell'istruzione EXECUTE MACRO.
EXEC <macroname>(value);
Esempio
L'esempio seguente esegue i nomi delle macro Get_Emp; Accetta il dipendente no come parametro ed estrae i record dalla tabella dei dipendenti per quel dipendente.
EXEC Get_Emp_Salary(101);
*** Query completed. One row found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo NetPay
----------- ------------
101 36000
Una procedura memorizzata contiene una serie di istruzioni SQL e istruzioni procedurali. Possono contenere solo dichiarazioni procedurali. La definizione della procedura memorizzata viene memorizzata nel database ei parametri vengono memorizzati nelle tabelle del dizionario dei dati.
Vantaggi
Le stored procedure riducono il carico di rete tra il client e il server.
Fornisce una maggiore sicurezza poiché si accede ai dati tramite stored procedure invece di accedervi direttamente.
Offre una migliore manutenzione poiché la logica aziendale viene testata e archiviata nel server.
Procedura di creazione
Le stored procedure vengono create utilizzando l'istruzione CREATE PROCEDURE.
Sintassi
Di seguito è riportata la sintassi generica dell'istruzione CREATE PROCEDURE.
CREATE PROCEDURE <procedurename> ( [parameter 1 data type, parameter 2 data type..] )
BEGIN
<SQL or SPL statements>;
END;
Esempio
Considera la seguente tabella dei salari.
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
102 | 80.000 | 6.000 | 74.000 |
103 | 90.000 | 7.000 | 83.000 |
104 | 75.000 | 5.000 | 70.000 |
L'esempio seguente crea una stored procedure denominata InsertSalary per accettare i valori e inserirli nella tabella Salary.
CREATE PROCEDURE InsertSalary (
IN in_EmployeeNo INTEGER, IN in_Gross INTEGER,
IN in_Deduction INTEGER, IN in_NetPay INTEGER
)
BEGIN
INSERT INTO Salary (
EmployeeNo,
Gross,
Deduction,
NetPay
)
VALUES (
:in_EmployeeNo,
:in_Gross,
:in_Deduction,
:in_NetPay
);
END;
Esecuzione delle procedure
Le stored procedure vengono eseguite utilizzando l'istruzione CALL.
Sintassi
Di seguito è riportata la sintassi generica dell'istruzione CALL.
CALL <procedure name> [(parameter values)];
Esempio
L'esempio seguente chiama la stored procedure InsertSalary e inserisce i record nella tabella Salary.
CALL InsertSalary(105,20000,2000,18000);
Una volta eseguita la query di cui sopra, produce il seguente output e puoi vedere la riga inserita nella tabella Salary.
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
102 | 80.000 | 6.000 | 74.000 |
103 | 90.000 | 7.000 | 83.000 |
104 | 75.000 | 5.000 | 70.000 |
105 | 20.000 | 2.000 | 18.000 |
Questo capitolo discute le varie strategie JOIN disponibili in Teradata.
Metodi di unione
Teradata utilizza diversi metodi di join per eseguire operazioni di join. Alcuni dei metodi Join comunemente usati sono:
- Unisci Unisci
- Join annidato
- Prodotto Join
Unisci Unisci
Il metodo Merge Join viene eseguito quando il join è basato sulla condizione di uguaglianza. Merge Join richiede che le righe di unione si trovino sullo stesso AMP. Le righe vengono unite in base all'hash delle righe. Merge Join utilizza diverse strategie di join per portare le righe nello stesso AMP.
Strategia n. 1
Se le colonne di join sono gli indici primari delle tabelle corrispondenti, le righe di join si trovano già sullo stesso AMP. In questo caso, non è richiesta alcuna distribuzione.
Considera le seguenti tabelle dei dipendenti e dei salari.
CREATE SET TABLE EMPLOYEE,FALLBACK (
EmployeeNo INTEGER,
FirstName VARCHAR(30) ,
LastName VARCHAR(30) ,
DOB DATE FORMAT 'YYYY-MM-DD',
JoinedDate DATE FORMAT 'YYYY-MM-DD',
DepartmentNo BYTEINT
)
UNIQUE PRIMARY INDEX ( EmployeeNo );
CREATE SET TABLE Salary (
EmployeeNo INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
UNIQUE PRIMARY INDEX(EmployeeNo);
Quando queste due tabelle vengono unite nella colonna EmployeeNo, non viene eseguita alcuna ridistribuzione poiché EmployeeNo è l'indice principale di entrambe le tabelle che vengono unite.
Strategia n. 2
Considera le seguenti tabelle Employee e Department.
CREATE SET TABLE EMPLOYEE,FALLBACK (
EmployeeNo INTEGER,
FirstName VARCHAR(30) ,
LastName VARCHAR(30) ,
DOB DATE FORMAT 'YYYY-MM-DD',
JoinedDate DATE FORMAT 'YYYY-MM-DD',
DepartmentNo BYTEINT
)
UNIQUE PRIMARY INDEX ( EmployeeNo );
CREATE SET TABLE DEPARTMENT,FALLBACK (
DepartmentNo BYTEINT,
DepartmentName CHAR(15)
)
UNIQUE PRIMARY INDEX ( DepartmentNo );
Se queste due tabelle vengono unite nella colonna DeparmentNo, le righe devono essere ridistribuite poiché DepartmentNo è un indice primario in una tabella e un indice non primario in un'altra tabella. In questo scenario, l'unione di righe potrebbe non trovarsi sullo stesso AMP. In tal caso, Teradata può ridistribuire la tabella dei dipendenti nella colonna DepartmentNo.
Strategia n. 3
Per le tabelle Employee e Department di cui sopra, Teradata può duplicare la tabella Department su tutti gli AMP, se la dimensione della tabella Department è piccola.
Join annidato
Nested Join non utilizza tutti gli AMP. Affinché il join annidato abbia luogo, una delle condizioni dovrebbe essere l'uguaglianza sull'indice primario univoco di una tabella e quindi l'unione di questa colonna a qualsiasi indice sull'altra tabella.
In questo scenario, il sistema recupererà una riga utilizzando l'indice primario univoco di una tabella e utilizzerà quell'hash di riga per recuperare i record corrispondenti da un'altra tabella. Il join annidato è il più efficiente di tutti i metodi Join.
Prodotto Join
Product Join confronta ogni riga qualificante di una tabella con ogni riga qualificante di un'altra tabella. L'unione del prodotto può avvenire a causa di alcuni dei seguenti fattori:
- Dove manca la condizione.
- La condizione di join non si basa sulla condizione di uguaglianza.
- Gli alias di tabella non sono corretti.
- Condizioni di join multiple.
Partitioned Primary Index (PPI) è un meccanismo di indicizzazione utile per migliorare le prestazioni di determinate query. Quando le righe vengono inserite in una tabella, vengono archiviate in un AMP e disposte in base all'ordine hash delle righe. Quando una tabella viene definita con PPI, le righe vengono ordinate in base al numero di partizione. All'interno di ogni partizione, sono organizzati in base al loro hash di riga. Le righe vengono assegnate a una partizione in base all'espressione di partizione definita.
Vantaggi
Evita la scansione completa della tabella per determinate query.
Evita di utilizzare un indice secondario che richiede una struttura fisica aggiuntiva e una manutenzione I / O aggiuntiva.
Accedi rapidamente a un sottoinsieme di una tabella di grandi dimensioni.
Elimina rapidamente i vecchi dati e aggiungi nuovi dati.
Esempio
Considera la seguente tabella degli ordini con l'indice primario su OrderNo.
StoreNo | Numero d'ordine | Data dell'ordine | Ordine totale |
---|---|---|---|
101 | 7501 | 2015-10-01 | 900 |
101 | 7502 | 2015-10-02 | 1.200 |
102 | 7503 | 2015-10-02 | 3.000 |
102 | 7504 | 2015-10-03 | 2.454 |
101 | 7505 | 2015-10-03 | 1201 |
103 | 7506 | 2015-10-04 | 2.454 |
101 | 7507 | 2015-10-05 | 1201 |
101 | 7508 | 2015-10-05 | 1201 |
Supponiamo che i record siano distribuiti tra AMP come mostrato nelle tabelle seguenti. Le registrazioni vengono archiviate in AMP, ordinate in base all'hash delle righe.
RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
3 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
3 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
Se esegui una query per estrarre gli ordini per una data particolare, l'ottimizzatore può scegliere di utilizzare la scansione completa della tabella, quindi è possibile accedere a tutti i record all'interno dell'AMP. Per evitare ciò, è possibile definire la data dell'ordine come Indice primario partizionato. Quando le righe vengono inserite nella tabella degli ordini, vengono partizionate in base alla data dell'ordine. All'interno di ogni partizione verranno ordinati in base all'hash della riga.
I dati seguenti mostrano come verranno archiviati i record negli AMP, se sono partizionati in base alla data dell'ordine. Se viene eseguita una query per accedere ai record in base alla data dell'ordine, si accederà solo alla partizione che contiene i record per quel particolare ordine.
Partizione | RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|---|
0 | 3 | 7501 | 2015-10-01 |
1 | 1 | 7505 | 2015-10-03 |
1 | 2 | 7504 | 2015-10-03 |
2 | 4 | 7508 | 2015-10-05 |
Partizione | RowHash | Numero d'ordine | Data dell'ordine |
---|---|---|---|
0 | 2 | 7502 | 2015-10-02 |
0 | 4 | 7503 | 2015-10-02 |
1 | 3 | 7506 | 2015-10-04 |
2 | 1 | 7507 | 2015-10-05 |
Di seguito è riportato un esempio per creare una tabella con l'indice primario della partizione. La clausola PARTITION BY viene utilizzata per definire la partizione.
CREATE SET TABLE Orders (
StoreNo SMALLINT,
OrderNo INTEGER,
OrderDate DATE FORMAT 'YYYY-MM-DD',
OrderTotal INTEGER
)
PRIMARY INDEX(OrderNo)
PARTITION BY RANGE_N (
OrderDate BETWEEN DATE '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY
);
Nell'esempio precedente, la tabella è partizionata in base alla colonna OrderDate. Ci sarà una partizione separata per ogni giorno.
Le funzioni OLAP sono simili alle funzioni aggregate tranne per il fatto che le funzioni aggregate restituiranno solo un valore mentre la funzione OLAP fornirà le singole righe oltre agli aggregati.
Sintassi
Di seguito è riportata la sintassi generale della funzione OLAP.
<aggregate function> OVER
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN
UNBOUDED PRECEDING AND UNBOUNDED FOLLOWING)
Le funzioni di aggregazione possono essere SUM, COUNT, MAX, MIN, AVG.
Esempio
Considera la seguente tabella degli stipendi.
EmployeeNo | Schifoso | Deduzione | Retribuzione netta |
---|---|---|---|
101 | 40.000 | 4.000 | 36.000 |
102 | 80.000 | 6.000 | 74.000 |
103 | 90.000 | 7.000 | 83.000 |
104 | 75.000 | 5.000 | 70.000 |
Di seguito è riportato un esempio per trovare la somma cumulativa o il totale parziale di NetPay nella tabella Salary. I record vengono ordinati per EmployeeNo e la somma cumulativa viene calcolata nella colonna NetPay.
SELECT
EmployeeNo, NetPay,
SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS
UNBOUNDED PRECEDING) as TotalSalary
FROM Salary;
Quando la query precedente viene eseguita, produce il seguente output.
EmployeeNo NetPay TotalSalary
----------- ----------- -----------
101 36000 36000
102 74000 110000
103 83000 193000
104 70000 263000
105 18000 281000
RANGO
La funzione RANK ordina i record in base alla colonna fornita. La funzione RANK può anche filtrare il numero di record restituiti in base al rango.
Sintassi
Di seguito è riportata la sintassi generica per utilizzare la funzione RANK.
RANK() OVER
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])
Esempio
Considera la seguente tabella Employee.
EmployeeNo | Nome di battesimo | Cognome | JoinedDate | DepartmentID | Data di nascita |
---|---|---|---|---|---|
101 | Mike | James | 27/3/2005 | 1 | 1/5/1980 |
102 | Roberto | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paolo | 21/03/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Roberto | James | 1/4/2008 | 3 | 12/1/1984 |
La seguente query ordina i record della tabella dei dipendenti in base alla data di iscrizione e assegna la classifica alla data di iscrizione.
SELECT EmployeeNo, JoinedDate,RANK()
OVER(ORDER BY JoinedDate) as Seniority
FROM Employee;
Quando la query precedente viene eseguita, produce il seguente output.
EmployeeNo JoinedDate Seniority
----------- ---------- -----------
101 2005-03-27 1
103 2007-03-21 2
102 2007-04-25 3
105 2008-01-04 4
104 2008-02-01 5
La clausola PARTITION BY raggruppa i dati in base alle colonne definite nella clausola PARTITION BY ed esegue la funzione OLAP all'interno di ogni gruppo. Di seguito è riportato un esempio della query che utilizza la clausola PARTITION BY.
SELECT EmployeeNo, JoinedDate,RANK()
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority
FROM Employee;
Quando la query precedente viene eseguita, produce il seguente output. Puoi vedere che il grado viene ripristinato per ogni dipartimento.
EmployeeNo DepartmentNo JoinedDate Seniority
----------- ------------ ---------- -----------
101 1 2005-03-27 1
103 2 2007-03-21 1
102 2 2007-04-25 2
104 2 2008-02-01 3
105 3 2008-01-04 1
In questo capitolo vengono illustrate le funzionalità disponibili per la protezione dei dati in Teradata.
Giornale transitorio
Teradata utilizza Transient Journal per proteggere i dati da errori di transazione. Ogni volta che viene eseguita una transazione, il giornale di registrazione transitorio conserva una copia delle immagini precedenti delle righe interessate finché la transazione non ha esito positivo o viene annullata correttamente. Quindi, le immagini precedenti vengono eliminate. Il diario transitorio viene mantenuto in ogni AMP. È un processo automatico e non può essere disabilitato.
Ricaderci
Il fallback protegge i dati della tabella archiviando la seconda copia delle righe di una tabella su un altro AMP chiamato come Fallback AMP. Se un AMP non riesce, si accede alle righe di fallback. Con questo, anche se un AMP non riesce, i dati sono ancora disponibili tramite AMP di riserva. L'opzione di fallback può essere utilizzata durante la creazione della tabella o dopo la creazione della tabella. Il fallback garantisce che la seconda copia delle righe della tabella sia sempre archiviata in un altro AMP per proteggere i dati da errori AMP. Tuttavia, il fallback occupa il doppio dello spazio di archiviazione e dell'I / O per inserimento / eliminazione / aggiornamento.
Il diagramma seguente mostra come la copia di riserva delle righe viene archiviata in un altro AMP.
Diario di ripristino AMP giù
Il journal di ripristino di Down AMP viene attivato quando AMP non riesce e la tabella è protetta da fallback. Questo giornale tiene traccia di tutte le modifiche ai dati dell'AMP non riuscito. Il journal viene attivato sugli AMP rimanenti nel cluster. È un processo automatico e non può essere disabilitato. Una volta che l'AMP non riuscito è attivo, i dati dal diario di recupero di Down AMP vengono sincronizzati con l'AMP. Fatto ciò, il giornale viene scartato.
Cliques
Clique è un meccanismo utilizzato da Teradata per proteggere i dati dai guasti dei nodi. Una cricca non è altro che un insieme di nodi Teradata che condividono un insieme comune di array di dischi. Quando un nodo si guasta, i vproc dal nodo guasto migreranno ad altri nodi nella clique e continueranno ad accedere ai loro array di dischi.
Nodo Hot Standby
Hot Standby Node è un nodo che non fa parte dell'ambiente di produzione. Se un nodo si guasta, i vproc dai nodi non riusciti migreranno al nodo hot standby. Una volta ripristinato, il nodo guasto diventa il nodo hot standby. I nodi Hot Standby vengono utilizzati per mantenere le prestazioni in caso di guasti ai nodi.
RAID
Redundant Array of Independent Disks (RAID) è un meccanismo utilizzato per proteggere i dati da errori del disco. L'array di dischi è costituito da un set di dischi raggruppati come unità logica. Questa unità può sembrare una singola unità per l'utente, ma possono essere distribuite su più dischi.
RAID 1 è comunemente usato in Teradata. In RAID 1, ogni disco è associato a un disco mirror. Qualsiasi modifica ai dati nel disco primario si riflette anche nella copia mirror. Se il disco primario si guasta, è possibile accedere ai dati dal disco mirror.
Questo capitolo ha discusso le varie strategie di gestione degli utenti in Teradata.
Utenti
Un utente viene creato utilizzando il comando CREATE USER. In Teradata, un utente è anche simile a un database. Ad entrambi è possibile assegnare spazio e contenere oggetti di database tranne per il fatto che all'utente viene assegnata una password.
Sintassi
Di seguito è riportata la sintassi per CREATE USER.
CREATE USER username
AS
[PERMANENT|PERM] = n BYTES
PASSWORD = password
TEMPORARY = n BYTES
SPOOL = n BYTES;
Durante la creazione di un utente, i valori per nome utente, spazio permanente e password sono obbligatori. Altri campi sono facoltativi.
Esempio
Di seguito è riportato un esempio per creare l'utente TD01.
CREATE USER TD01
AS
PERMANENT = 1000000 BYTES
PASSWORD = ABC$124
TEMPORARY = 1000000 BYTES
SPOOL = 1000000 BYTES;
Conti
Durante la creazione di un nuovo utente, l'utente può essere assegnato a un account. L'opzione ACCOUNT in CREATE USER viene utilizzata per assegnare l'account. Un utente può essere assegnato a più account.
Sintassi
Di seguito è riportata la sintassi per CREATE USER con l'opzione account.
CREATE USER username
PERM = n BYTES
PASSWORD = password
ACCOUNT = accountid
Esempio
Il seguente esempio crea l'utente TD02 e assegna l'account come IT e Admin.
CREATE USER TD02
AS
PERMANENT = 1000000 BYTES
PASSWORD = abc$123
TEMPORARY = 1000000 BYTES
SPOOL = 1000000 BYTES
ACCOUNT = (‘IT’,’Admin’);
L'utente può specificare l'ID account durante l'accesso al sistema Teradata o dopo aver effettuato l'accesso al sistema utilizzando il comando SET SESSION.
.LOGON username, passowrd,accountid
OR
SET SESSION ACCOUNT = accountid
Concedi privilegi
Il comando GRANT viene utilizzato per assegnare uno o più privilegi sugli oggetti del database all'utente o al database.
Sintassi
Di seguito è riportata la sintassi del comando GRANT.
GRANT privileges ON objectname TO username;
I privilegi possono essere INSERT, SELECT, UPDATE, REFERENCES.
Esempio
Di seguito è riportato un esempio di dichiarazione GRANT.
GRANT SELECT,INSERT,UPDATE ON Employee TO TD01;
Revoca privilegi
Il comando REVOKE rimuove i privilegi dagli utenti o dai database. Il comando REVOKE può rimuovere solo privilegi espliciti.
Sintassi
Di seguito è riportata la sintassi di base per il comando REVOKE.
REVOKE [ALL|privileges] ON objectname FROM username;
Esempio
Di seguito è riportato un esempio del comando REVOKE.
REVOKE INSERT,SELECT ON Employee FROM TD01;
Questo capitolo descrive la procedura di ottimizzazione delle prestazioni in Teradata.
Spiegare
Il primo passaggio nell'ottimizzazione delle prestazioni è l'utilizzo di EXPLAIN sulla query. Il piano EXPLAIN fornisce i dettagli su come l'ottimizzatore eseguirà la query. Nel piano Explain, controlla le parole chiave come livello di confidenza, strategia di join utilizzata, dimensione del file di spool, ridistribuzione, ecc.
Raccogli statistiche
Optimizer utilizza i dati demografici dei dati per elaborare una strategia di esecuzione efficace. Il comando COLLECT STATISTICS viene utilizzato per raccogliere i dati demografici della tabella. Assicurati che le statistiche raccolte sulle colonne siano aggiornate.
Raccogliere statistiche sulle colonne utilizzate nella clausola WHERE e sulle colonne utilizzate nella condizione di unione.
Raccogli statistiche sulle colonne Indice primario univoco.
Raccogli le statistiche sulle colonne dell'indice secondario non univoco. L'ottimizzatore deciderà se può utilizzare NUSI o Full Table Scan.
Raccogli le statistiche sull'indice di join anche se vengono raccolte le statistiche sulla tabella di base.
Raccogli le statistiche sulle colonne di partizionamento.
Tipi di dati
Assicurati che vengano utilizzati i tipi di dati corretti. Ciò eviterà l'uso di uno spazio di archiviazione eccessivo rispetto a quanto richiesto.
Conversione
Assicurati che i tipi di dati delle colonne utilizzate nella condizione di join siano compatibili per evitare conversioni di dati esplicite.
Ordinare
Rimuovere le clausole ORDER BY non necessarie se non richiesto.
Problema di spazio spool
L'errore di spazio di spooling viene generato se la query supera il limite di spazio di spool per AMP per quell'utente. Verificare il piano di spiegazione e identificare il passaggio che consuma più spazio di bobina. Queste query intermedie possono essere suddivise e inserite separatamente per creare tabelle temporanee.
Indice primario
Assicurati che l'indice primario sia definito correttamente per la tabella. La colonna dell'indice principale dovrebbe distribuire uniformemente i dati e dovrebbe essere usata frequentemente per accedere ai dati.
Tavola apparecchiata
Se si definisce una tabella SET, l'ottimizzatore controllerà se il record è duplicato per ogni record inserito. Per rimuovere la condizione di controllo duplicato, è possibile definire l'indice secondario univoco per la tabella.
AGGIORNAMENTO sul tavolo grande
L'aggiornamento della tabella grande richiederà molto tempo. Invece di aggiornare la tabella, puoi eliminare i record e inserire i record con righe modificate.
Eliminazione di tabelle temporanee
Eliminare le tabelle temporanee (tabelle di staging) e i volatili se non sono più necessari. Ciò libererà spazio permanente e spazio sulla bobina.
Tavolo MULTISET
Se si è certi che i record di input non avranno record duplicati, è possibile definire la tabella di destinazione come tabella MULTISET per evitare il controllo delle righe duplicate utilizzato dalla tabella SET.
L'utility FastLoad viene utilizzata per caricare i dati in tabelle vuote. Poiché non utilizza giornali temporanei, i dati possono essere caricati rapidamente. Non carica le righe duplicate anche se la tabella di destinazione è una tabella MULTISET.
Limitazione
La tabella di destinazione non deve avere un indice secondario, un indice di join e un riferimento a chiave esterna.
Come funziona FastLoad
FastLoad viene eseguito in due fasi.
Fase 1
I motori di analisi leggono i record dal file di input e inviano un blocco a ciascun AMP.
Ogni AMP memorizza i blocchi di record.
Quindi gli AMP eseguono l'hashing di ogni record e li ridistribuiscono nell'AMP corretto.
Alla fine della Fase 1, ogni AMP ha le sue righe ma non sono nella sequenza hash delle righe.
Fase 2
La fase 2 inizia quando FastLoad riceve l'istruzione END LOADING.
Ogni AMP ordina i record sull'hash di riga e li scrive sul disco.
I blocchi sulla tabella di destinazione vengono rilasciati e le tabelle di errore vengono eliminate.
Esempio
Crea un file di testo con i seguenti record e denomina il file come dipendente.txt.
101,Mike,James,1980-01-05,2010-03-01,1
102,Robert,Williams,1983-03-05,2010-09-01,1
103,Peter,Paul,1983-04-01,2009-02-12,2
104,Alex,Stuart,1984-11-06,2014-01-01,2
105,Robert,James,1984-12-01,2015-03-09,3
Di seguito è riportato uno script FastLoad di esempio per caricare il file precedente nella tabella Employee_Stg.
LOGON 192.168.1.102/dbc,dbc;
DATABASE tduser;
BEGIN LOADING tduser.Employee_Stg
ERRORFILES Employee_ET, Employee_UV
CHECKPOINT 10;
SET RECORD VARTEXT ",";
DEFINE in_EmployeeNo (VARCHAR(10)),
in_FirstName (VARCHAR(30)),
in_LastName (VARCHAR(30)),
in_BirthDate (VARCHAR(10)),
in_JoinedDate (VARCHAR(10)),
in_DepartmentNo (VARCHAR(02)),
FILE = employee.txt;
INSERT INTO Employee_Stg (
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
)
VALUES (
:in_EmployeeNo,
:in_FirstName,
:in_LastName,
:in_BirthDate (FORMAT 'YYYY-MM-DD'),
:in_JoinedDate (FORMAT 'YYYY-MM-DD'),
:in_DepartmentNo
);
END LOADING;
LOGOFF;
Esecuzione di uno script FastLoad
Dopo aver creato il file di input dipendente.txt e lo script FastLoad è denominato EmployeeLoad.fl, è possibile eseguire lo script FastLoad utilizzando il seguente comando in UNIX e Windows.
FastLoad < EmployeeLoad.fl;
Una volta eseguito il comando precedente, lo script FastLoad verrà eseguito e produrrà il registro. Nel registro è possibile visualizzare il numero di record elaborati da FastLoad e il codice di stato.
**** 03:19:14 END LOADING COMPLETE
Total Records Read = 5
Total Error Table 1 = 0 ---- Table has been dropped
Total Error Table 2 = 0 ---- Table has been dropped
Total Inserts Applied = 5
Total Duplicate Rows = 0
Start: Fri Jan 8 03:19:13 2016
End : Fri Jan 8 03:19:14 2016
**** 03:19:14 Application Phase statistics:
Elapsed time: 00:00:01 (in hh:mm:ss)
0008 LOGOFF;
**** 03:19:15 Logging off all sessions
Termini di FastLoad
Di seguito è riportato l'elenco dei termini comuni utilizzati nello script FastLoad.
LOGON - Accede a Teradata e avvia una o più sessioni.
DATABASE - Imposta il database predefinito.
BEGIN LOADING - Identifica la tabella da caricare.
ERRORFILES - Identifica le 2 tabelle di errore che devono essere create / aggiornate.
CHECKPOINT - Definisce quando prendere il checkpoint.
SET RECORD - Specifica se il formato del file di input è formattato, binario, di testo o non formattato.
DEFINE - Definisce il layout del file di input.
FILE - Specifica il nome e il percorso del file di input.
INSERT - Inserisce i record dal file di input nella tabella di destinazione.
END LOADING- Avvia la fase 2 del FastLoad. Distribuisce i record nella tabella di destinazione.
LOGOFF - Termina tutte le sessioni e termina FastLoad.
MultiLoad può caricare più tabelle alla volta e può anche eseguire diversi tipi di attività come INSERT, DELETE, UPDATE e UPSERT. Può caricare fino a 5 tabelle alla volta ed eseguire fino a 20 operazioni DML in uno script. La tabella di destinazione non è richiesta per MultiLoad.
MultiLoad supporta due modalità:
- IMPORT
- DELETE
MultiLoad richiede una tabella di lavoro, una tabella di registro e due tabelle di errori oltre alla tabella di destinazione.
Log Table - Usato per mantenere i checkpoint presi durante il caricamento che verranno usati per il riavvio.
Error Tables- Queste tabelle vengono inserite durante il caricamento quando si verifica un errore. La prima tabella degli errori memorizza gli errori di conversione mentre la seconda tabella degli errori memorizza i record duplicati.
Log Table - Mantiene i risultati di ogni fase di MultiLoad a scopo di riavvio.
Work table- Lo script MultiLoad crea una tabella di lavoro per tabella di destinazione. La tabella di lavoro viene utilizzata per conservare le attività DML e i dati di input.
Limitazione
MultiLoad ha alcune limitazioni.
- Indice secondario univoco non supportato sulla tabella di destinazione.
- Integrità referenziale non supportata.
- Trigger non supportati.
Come funziona MultiLoad
L'importazione di MultiLoad prevede cinque fasi:
Phase 1 - Fase preliminare: esegue le attività di configurazione di base.
Phase 2 - Fase di transazione DML: verifica la sintassi delle istruzioni DML e le porta al sistema Teradata.
Phase 3 - Fase di acquisizione: porta i dati di input nelle tabelle di lavoro e blocca la tabella.
Phase 4 - Fase di applicazione: applica tutte le operazioni DML.
Phase 5 - Fase di pulizia: rilascia il blocco della tabella.
I passaggi coinvolti in uno script MultiLoad sono:
Step 1 - Imposta la tabella di registro.
Step 2 - Accedi a Teradata.
Step 3 - Specificare le tabelle Target, Lavoro ed Errore.
Step 4 - Definisce il layout del file INPUT.
Step 5 - Definisci le query DML.
Step 6 - Assegna un nome al file IMPORT.
Step 7 - Specificare il LAYOUT da utilizzare.
Step 8 - Avvia il caricamento.
Step 9 - Termina il caricamento e termina le sessioni.
Esempio
Crea un file di testo con i seguenti record e denomina il file come dipendente.txt.
101,Mike,James,1980-01-05,2010-03-01,1
102,Robert,Williams,1983-03-05,2010-09-01,1
103,Peter,Paul,1983-04-01,2009-02-12,2
104,Alex,Stuart,1984-11-06,2014-01-01,2
105,Robert,James,1984-12-01,2015-03-09,3
L'esempio seguente è uno script MultiLoad che legge i record dalla tabella Employee e li carica nella tabella Employee_Stg.
.LOGTABLE tduser.Employee_log;
.LOGON 192.168.1.102/dbc,dbc;
.BEGIN MLOAD TABLES Employee_Stg;
.LAYOUT Employee;
.FIELD in_EmployeeNo * VARCHAR(10);
.FIELD in_FirstName * VARCHAR(30);
.FIELD in_LastName * VARCHAR(30);
.FIELD in_BirthDate * VARCHAR(10);
.FIELD in_JoinedDate * VARCHAR(10);
.FIELD in_DepartmentNo * VARCHAR(02);
.DML LABEL EmpLabel;
INSERT INTO Employee_Stg (
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
)
VALUES (
:in_EmployeeNo,
:in_FirstName,
:in_Lastname,
:in_BirthDate,
:in_JoinedDate,
:in_DepartmentNo
);
.IMPORT INFILE employee.txt
FORMAT VARTEXT ','
LAYOUT Employee
APPLY EmpLabel;
.END MLOAD;
LOGOFF;
Esecuzione di uno script MultiLoad
Dopo aver creato il file di input dipendente.txt e lo script multiload è denominato EmployeeLoad.ml, è possibile eseguire lo script Multiload utilizzando il seguente comando in UNIX e Windows.
Multiload < EmployeeLoad.ml;
L'utilità FastExport viene utilizzata per esportare i dati dalle tabelle Teradata in file flat. Può anche generare i dati in formato report. I dati possono essere estratti da una o più tabelle utilizzando Join. Poiché FastExport esporta i dati in blocchi da 64 KB, è utile per estrarre grandi volumi di dati.
Esempio
Considera la seguente tabella Employee.
EmployeeNo | Nome di battesimo | Cognome | Data di nascita |
---|---|---|---|
101 | Mike | James | 1/5/1980 |
104 | Alex | Stuart | 11/6/1984 |
102 | Roberto | Williams | 3/5/1983 |
105 | Roberto | James | 12/1/1984 |
103 | Peter | Paolo | 4/1/1983 |
Di seguito è riportato un esempio di uno script FastExport. Esporta i dati dalla tabella dei dipendenti e li scrive in un file Employeedata.txt.
.LOGTABLE tduser.employee_log;
.LOGON 192.168.1.102/dbc,dbc;
DATABASE tduser;
.BEGIN EXPORT SESSIONS 2;
.EXPORT OUTFILE employeedata.txt
MODE RECORD FORMAT TEXT;
SELECT CAST(EmployeeNo AS CHAR(10)),
CAST(FirstName AS CHAR(15)),
CAST(LastName AS CHAR(15)),
CAST(BirthDate AS CHAR(10))
FROM
Employee;
.END EXPORT;
.LOGOFF;
Esecuzione di uno script FastExport
Una volta che lo script è stato scritto e denominato come dipendente.fx, è possibile utilizzare il seguente comando per eseguire lo script.
fexp < employee.fx
Dopo aver eseguito il comando precedente, riceverai il seguente output nel file Employeedata.txt.
103 Peter Paul 1983-04-01
101 Mike James 1980-01-05
102 Robert Williams 1983-03-05
105 Robert James 1984-12-01
104 Alex Stuart 1984-11-06
Termini FastExport
Di seguito è riportato l'elenco dei termini comunemente utilizzati nello script FastExport.
LOGTABLE - Specifica la tabella di registro a scopo di riavvio.
LOGON - Accede a Teradata e avvia una o più sessioni.
DATABASE - Imposta il database predefinito.
BEGIN EXPORT - Indica l'inizio dell'esportazione.
EXPORT - Specifica il file di destinazione e il formato di esportazione.
SELECT - Specifica la query di selezione per esportare i dati.
END EXPORT - Specifica la fine di FastExport.
LOGOFF - Termina tutte le sessioni e termina FastExport.
L'utilità BTEQ è una potente utilità in Teradata che può essere utilizzata sia in modalità batch che interattiva. Può essere utilizzato per eseguire qualsiasi istruzione DDL, istruzione DML, creare macro e stored procedure. BTEQ può essere utilizzato per importare dati in tabelle Teradata da file flat e può anche essere utilizzato per estrarre dati da tabelle in file o report.
Termini BTEQ
Di seguito è riportato l'elenco dei termini comunemente utilizzati negli script BTEQ.
LOGON - Usato per accedere al sistema Teradata.
ACTIVITYCOUNT - Restituisce il numero di righe interessate dalla query precedente.
ERRORCODE - Restituisce il codice di stato della query precedente.
DATABASE - Imposta il database predefinito.
LABEL - Assegna un'etichetta a una serie di comandi SQL.
RUN FILE - Esegue la query contenuta in un file.
GOTO - Trasferisce il controllo a un'etichetta.
LOGOFF - Si disconnette dal database e termina tutte le sessioni.
IMPORT - Specifica il percorso del file di input.
EXPORT - Specifica il percorso del file di output e avvia l'esportazione.
Esempio
Di seguito è riportato uno script BTEQ di esempio.
.LOGON 192.168.1.102/dbc,dbc;
DATABASE tduser;
CREATE TABLE employee_bkup (
EmployeeNo INTEGER,
FirstName CHAR(30),
LastName CHAR(30),
DepartmentNo SMALLINT,
NetPay INTEGER
)
Unique Primary Index(EmployeeNo);
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;
SELECT * FROM
Employee
Sample 1;
.IF ACTIVITYCOUNT <> 0 THEN .GOTO InsertEmployee;
DROP TABLE employee_bkup;
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;
.LABEL InsertEmployee
INSERT INTO employee_bkup
SELECT a.EmployeeNo,
a.FirstName,
a.LastName,
a.DepartmentNo,
b.NetPay
FROM
Employee a INNER JOIN Salary b
ON (a.EmployeeNo = b.EmployeeNo);
.IF ERRORCODE <> 0 THEN .EXIT ERRORCODE;
.LOGOFF;
Lo script precedente esegue le seguenti attività.
Accede al sistema Teradata.
Imposta il database predefinito.
Crea una tabella denominata dipendente_bkup.
Seleziona un record dalla tabella Employee per verificare se la tabella ha record.
Elimina la tabella dipendente_bkup, se la tabella è vuota.
Trasferisce il controllo a un'etichetta InsertEmployee che inserisce i record nella tabella employee_bkup
Controlla ERRORCODE per assicurarsi che l'istruzione abbia esito positivo, dopo ogni istruzione SQL.
ACTIVITYCOUNT restituisce il numero di record selezionati / interessati dalla query SQL precedente.