Teradata - Guide rapide
Qu'est-ce que Teradata?
Teradata est l'un des systèmes de gestion de bases de données relationnelles les plus populaires. Il convient principalement à la création d'applications d'entreposage de données à grande échelle. Teradata y parvient grâce au concept de parallélisme. Il est développé par la société Teradata.
Histoire de Teradata
Voici un bref résumé de l'histoire de Teradata, énumérant les principales étapes.
1979 - Teradata a été incorporée.
1984 - Sortie du premier ordinateur de base de données DBC / 1012.
1986- Le magazine Fortune nomme Teradata «Produit de l'année».
1999 - La plus grande base de données au monde utilisant Teradata avec 130 téraoctets.
2002 - Teradata V2R5 publié avec l'index primaire de partition et la compression.
2006 - Lancement de la solution Teradata Master Data Management.
2008 - Teradata 13.0 est disponible avec Active Data Warehousing.
2011 - Acquiert Teradata Aster et entre dans Advanced Analytics Space.
2012 - Introduction de Teradata 14.0.
2014 - Introduction de Teradata 15.0.
Caractéristiques de Teradata
Voici quelques-unes des fonctionnalités de Teradata -
Unlimited Parallelism- Le système de base de données Teradata est basé sur l'architecture de traitement massivement parallèle (MPP). L'architecture MPP répartit la charge de travail uniformément sur l'ensemble du système. Le système Teradata répartit la tâche entre ses processus et les exécute en parallèle pour s'assurer que la tâche est terminée rapidement.
Shared Nothing Architecture- L'architecture de Teradata est appelée architecture de rien partagé. Les nœuds Teradata, ses processeurs de module d'accès (AMP) et les disques associés aux AMP fonctionnent indépendamment. Ils ne sont pas partagés avec les autres.
Linear Scalability- Les systèmes Teradata sont hautement évolutifs. Ils peuvent évoluer jusqu'à 2048 nœuds. Par exemple, vous pouvez doubler la capacité du système en doublant le nombre d'AMP.
Connectivity - Teradata peut se connecter à des systèmes connectés au canal tels que les systèmes mainframe ou connectés au réseau.
Mature Optimizer- L'optimiseur Teradata est l'un des optimiseurs mûrs du marché. Il a été conçu pour être parallèle depuis ses débuts. Il a été affiné pour chaque version.
SQL- Teradata prend en charge SQL standard pour interagir avec les données stockées dans les tables. En plus de cela, il fournit sa propre extension.
Robust Utilities - Teradata fournit des utilitaires robustes pour importer / exporter des données depuis / vers le système Teradata tels que FastLoad, MultiLoad, FastExport et TPT.
Automatic Distribution - Teradata distribue automatiquement les données uniformément sur les disques sans aucune intervention manuelle.
Teradata fournit Teradata express pour VMWARE qui est une machine virtuelle Teradata pleinement opérationnelle. Il fournit jusqu'à 1 téraoctet de stockage. Teradata fournit une version de 40 Go et 1 To de VMware.
Conditions préalables
Étant donné que la machine virtuelle est 64 bits, votre processeur doit prendre en charge 64 bits.
Étapes d'installation pour Windows
Step 1 - Téléchargez la version de VM requise à partir du lien, https://downloads.teradata.com/download/database/teradata-express-for-vmware-player
Step 2 - Extrayez le fichier et spécifiez le dossier cible.
Step 3 - Téléchargez le lecteur VMWare Workstation à partir du lien, https://my.vmware.com/web/vmware/downloads. Il est disponible pour Windows et Linux. Téléchargez le lecteur de station de travail VMWARE pour Windows.
Step 4 - Une fois le téléchargement terminé, installez le logiciel.
Step 5 - Une fois l'installation terminée, exécutez le client VMWARE.
Step 6- Sélectionnez «Ouvrir une machine virtuelle». Naviguez dans le dossier Teradata VMWare extrait et sélectionnez le fichier avec l'extension .vmdk.
Step 7- Teradata VMWare est ajouté au client VMWare. Sélectionnez le Teradata VMware ajouté et cliquez sur «Play Virtual Machine».
Step 8 - Si vous obtenez une fenêtre contextuelle sur les mises à jour logicielles, vous pouvez sélectionner «Me le rappeler plus tard».
Step 9 - Entrez le nom d'utilisateur en tant que root, appuyez sur tab et entrez le mot de passe en tant que root et appuyez à nouveau sur Entrée.
Step 10- Une fois que l'écran suivant apparaît sur le bureau, double-cliquez sur «root's home». Ensuite, double-cliquez sur 'Genome's Terminal'. Cela ouvrira le Shell.
Step 11- Depuis le shell suivant, entrez la commande /etc/init.d/tpa start. Cela démarrera le serveur Teradata.
Démarrage de BTEQ
L'utilitaire BTEQ est utilisé pour soumettre des requêtes SQL de manière interactive. Voici les étapes pour démarrer l'utilitaire BTEQ.
Step 1 - Entrez la commande / sbin / ifconfig et notez l'adresse IP du VMWare.
Step 2- Exécutez la commande bteq. À l'invite de connexion, entrez la commande.
Connectez-vous <adresseip> / dbc, dbc; et entrez À l'invite du mot de passe, entrez le mot de passe comme dbc;
Vous pouvez vous connecter au système Teradata à l'aide de BTEQ et exécuter toutes les requêtes SQL.
L'architecture Teradata est basée sur une architecture de traitement massivement parallèle (MPP). Les principaux composants de Teradata sont le moteur d'analyse, le BYNET et les processeurs de module d'accès (AMP). Le diagramme suivant montre l'architecture de haut niveau d'un nœud Teradata.
Composants de Teradata
Les composants clés de Teradata sont les suivants -
Node- C'est l'unité de base de Teradata System. Chaque serveur individuel d'un système Teradata est appelé un nœud. Un nœud se compose de son propre système d'exploitation, de son processeur, de sa mémoire, de sa propre copie du logiciel Teradata RDBMS et de son espace disque. Une armoire se compose d'un ou de plusieurs nœuds.
Parsing Engine- Parsing Engine est responsable de la réception des requêtes du client et de la préparation d'un plan d'exécution efficace. Les responsabilités du moteur d'analyse sont -
Recevoir la requête SQL du client
Analyser la recherche de requête SQL pour les erreurs de syntaxe
Vérifiez si l'utilisateur dispose des privilèges requis sur les objets utilisés dans la requête SQL
Vérifier si les objets utilisés dans le SQL existent réellement
Préparer le plan d'exécution pour exécuter la requête SQL et le transmettre à BYNET
Reçoit les résultats des AMP et les envoie au client
Message Passing Layer- La couche de transmission de messages appelée BYNET, est la couche réseau du système Teradata. Il permet la communication entre PE et AMP ainsi qu'entre les nœuds. Il reçoit le plan d'exécution du Parsing Engine et l'envoie à AMP. De même, il reçoit les résultats des AMP et les envoie au Parsing Engine.
Access Module Processor (AMP)- Les AMP, appelés processeurs virtuels (vprocs), sont ceux qui stockent et récupèrent réellement les données. Les AMP reçoivent les données et le plan d'exécution du Parsing Engine, effectuent toute conversion de type de données, agrégation, filtrage, tri et stocke les données sur les disques qui leur sont associés. Les enregistrements des tables sont répartis uniformément entre les SAP du système. Chaque AMP est associé à un ensemble de disques sur lesquels les données sont stockées. Seul cet AMP peut lire / écrire des données à partir des disques.
Architecture de stockage
Lorsque le client exécute des requêtes pour insérer des enregistrements, le moteur d'analyse envoie les enregistrements à BYNET. BYNET récupère les enregistrements et envoie la ligne à l'AMP cible. AMP stocke ces enregistrements sur ses disques. Le diagramme suivant montre l'architecture de stockage de Teradata.
Architecture de récupération
Lorsque le client exécute des requêtes pour récupérer des enregistrements, le moteur d'analyse envoie une requête à BYNET. BYNET envoie la demande de récupération aux AMP appropriés. Les AMP recherchent ensuite leurs disques en parallèle et identifient les enregistrements requis et les envoient à BYNET. BYNET envoie ensuite les enregistrements à Parsing Engine qui à son tour les enverra au client. Voici l'architecture de récupération de Teradata.
Le système de gestion de base de données relationnelle (SGBDR) est un logiciel de SGBD qui permet d'interagir avec les bases de données. Ils utilisent le langage SQL (Structured Query Language) pour interagir avec les données stockées dans les tables.
Base de données
La base de données est une collection de données liées logiquement. Ils sont accessibles par de nombreux utilisateurs à des fins différentes. Par exemple, une base de données des ventes contient des informations complètes sur les ventes qui sont stockées dans de nombreuses tables.
les tables
Les tables sont l'unité de base du SGBDR où les données sont stockées. Une table est une collection de lignes et de colonnes. Voici un exemple de table des employés.
Numéro d'employé | Prénom | Nom de famille | Date de naissance |
---|---|---|---|
101 | Mike | James | 05/01/1980 |
104 | Alex | Stuart | 06/11/1984 |
102 | Robert | Williams | 05/03/1983 |
105 | Robert | James | 01/12/1984 |
103 | Peter | Paul | 01/04/1983 |
Colonnes
Une colonne contient des données similaires. Par exemple, la colonne Date de naissance dans la table Employé contient des informations de date de naissance pour tous les employés.
Date de naissance |
---|
05/01/1980 |
06/11/1984 |
05/03/1983 |
01/12/1984 |
01/04/1983 |
Rangée
Row est une instance de toutes les colonnes. Par exemple, dans la table des employés, une ligne contient des informations sur un seul employé.
Numéro d'employé | Prénom | Nom de famille | Date de naissance |
---|---|---|---|
101 | Mike | James | 05/01/1980 |
Clé primaire
La clé primaire est utilisée pour identifier de manière unique une ligne dans une table. Aucune valeur en double n'est autorisée dans une colonne de clé primaire et ils ne peuvent pas accepter les valeurs NULL. C'est un champ obligatoire dans une table.
Clé étrangère
Les clés étrangères sont utilisées pour construire une relation entre les tables. Une clé étrangère dans une table enfant est définie comme clé primaire dans la table parent. Une table peut avoir plus d'une clé étrangère. Il peut accepter des valeurs en double et également des valeurs nulles. Les clés étrangères sont facultatives dans une table.
Chaque colonne d'une table est associée à un type de données. Les types de données spécifient le type de valeurs qui seront stockées dans la colonne. Teradata prend en charge plusieurs types de données. Voici quelques-uns des types de données fréquemment utilisés.
Types de données | Longueur (octets) | Gamme de valeurs |
---|---|---|
BYTEINT | 1 | -128 à +127 |
PETITE MENTHE | 2 | -32768 à +32767 |
ENTIER | 4 | -2 147 483 648 à +2 147 483 647 |
GRAND | 8 | -9,233,372,036,854,775,80 8 à +9,233,372,036,854,775,8 07 |
DÉCIMAL | 1-16 | |
NUMÉRIQUE | 1-16 | |
FLOTTE | 8 | Format IEEE |
CARBONISER | Format fixe | 1 à 64 000 |
VARCHAR | Variable | 1 à 64 000 |
DATE | 4 | AAAAMMJJ |
TEMPS | 6 ou 8 | HHMMSS.nnnnnn or HHMMSS.nnnnnn + HHMM |
HORAIRE | 10 ou 12 | AAMMJJHHMMSS.nnnnnn or AAMMJJHHMMSS.nnnnnn + HHMM |
Les tableaux du modèle relationnel sont définis comme une collection de données. Ils sont représentés sous forme de lignes et de colonnes.
Types de table
Types Teradata prend en charge différents types de tables.
Permanent Table - Il s'agit du tableau par défaut et il contient des données insérées par l'utilisateur et stocke les données en permanence.
Volatile Table- Les données insérées dans une table volatile ne sont conservées que pendant la session utilisateur. La table et les données sont supprimées à la fin de la session. Ces tables sont principalement utilisées pour contenir les données intermédiaires lors de la transformation des données.
Global Temporary Table - La définition des tables temporaires globales est persistante mais les données de la table sont supprimées à la fin de la session utilisateur.
Derived Table- La table dérivée contient les résultats intermédiaires dans une requête. Leur durée de vie est comprise dans la requête dans laquelle ils sont créés, utilisés et supprimés.
Définir contre multiset
Teradata classe les tables en tant que tables SET ou MULTISET en fonction de la façon dont les enregistrements en double sont traités. Une table définie comme table SET ne stocke pas les enregistrements en double, tandis que la table MULTISET peut stocker des enregistrements en double.
Sr.Non | Commandes et description de la table |
---|---|
1 | Créer une table La commande CREATE TABLE est utilisée pour créer des tables dans Teradata. |
2 | Modifier table La commande ALTER TABLE est utilisée pour ajouter ou supprimer des colonnes d'une table existante. |
3 | Table de dépôt La commande DROP TABLE est utilisée pour supprimer une table. |
Ce chapitre présente les commandes SQL utilisées pour manipuler les données stockées dans les tables Teradata.
Insérer des enregistrements
L'instruction INSERT INTO est utilisée pour insérer des enregistrements dans la table.
Syntaxe
Voici la syntaxe générique pour INSERT INTO.
INSERT INTO <tablename>
(column1, column2, column3,…)
VALUES
(value1, value2, value3 …);
Exemple
L'exemple suivant insère des enregistrements dans la table des employés.
INSERT INTO Employee (
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
)
VALUES (
101,
'Mike',
'James',
'1980-01-05',
'2005-03-27',
01
);
Une fois la requête ci-dessus insérée, vous pouvez utiliser l'instruction SELECT pour afficher les enregistrements de la table.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementNon | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
Insérer à partir d'une autre table
L'instruction INSERT SELECT est utilisée pour insérer des enregistrements d'une autre table.
Syntaxe
Voici la syntaxe générique pour INSERT INTO.
INSERT INTO <tablename>
(column1, column2, column3,…)
SELECT
column1, column2, column3…
FROM
<source table>;
Exemple
L'exemple suivant insère des enregistrements dans la table des employés. Créez une table appelée Employee_Bkup avec la même définition de colonne que la table employee avant d'exécuter la requête d'insertion suivante.
INSERT INTO Employee_Bkup (
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
)
SELECT
EmployeeNo,
FirstName,
LastName,
BirthDate,
JoinedDate,
DepartmentNo
FROM
Employee;
Lorsque la requête ci-dessus est exécutée, elle insère tous les enregistrements de la table employee dans la table employee_bkup.
Règles
Le nombre de colonnes spécifié dans la liste VALUES doit correspondre aux colonnes spécifiées dans la clause INSERT INTO.
Les valeurs sont obligatoires pour les colonnes NOT NULL.
Si aucune valeur n'est spécifiée, NULL est inséré pour les champs NULL.
Les types de données des colonnes spécifiés dans la clause VALUES doivent être compatibles avec les types de données des colonnes de la clause INSERT.
Mettre à jour les enregistrements
L'instruction UPDATE est utilisée pour mettre à jour les enregistrements de la table.
Syntaxe
Voici la syntaxe générique pour UPDATE.
UPDATE <tablename>
SET <columnnamme> = <new value>
[WHERE condition];
Exemple
L'exemple suivant met à jour le service des employés à 03 pour l'employé 101.
UPDATE Employee
SET DepartmentNo = 03
WHERE EmployeeNo = 101;
Dans la sortie suivante, vous pouvez voir que le DepartmentNo est mis à jour de 1 à 3 pour 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
Règles
Vous pouvez mettre à jour une ou plusieurs valeurs de la table.
Si la condition WHERE n'est pas spécifiée, toutes les lignes de la table sont affectées.
Vous pouvez mettre à jour une table avec les valeurs d'une autre table.
Supprimer des enregistrements
L'instruction DELETE FROM est utilisée pour mettre à jour les enregistrements de la table.
Syntaxe
Voici la syntaxe générique de DELETE FROM.
DELETE FROM <tablename>
[WHERE condition];
Exemple
L'exemple suivant supprime l'employé 101 de la table employé.
DELETE FROM Employee
WHERE EmployeeNo = 101;
Dans la sortie suivante, vous pouvez voir que l'employé 101 est supprimé de la table.
SELECT EmployeeNo FROM Employee;
*** Query completed. No rows found.
*** Total elapsed time was 1 second.
Règles
Vous pouvez mettre à jour un ou plusieurs enregistrements de la table.
Si la condition WHERE n'est pas spécifiée, toutes les lignes de la table sont supprimées.
Vous pouvez mettre à jour une table avec les valeurs d'une autre table.
L'instruction SELECT est utilisée pour récupérer des enregistrements d'une table.
Syntaxe
Voici la syntaxe de base de l'instruction SELECT.
SELECT
column 1, column 2, .....
FROM
tablename;
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementNon | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
102 | Robert | Williams | 25/04/2007 | 2 | 05/03/1983 |
103 | Peter | Paul | 21/03/2007 | 2 | 01/04/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 06/11/1984 |
105 | Robert | James | 1/4/2008 | 3 | 01/12/1984 |
Voici un exemple d'instruction SELECT.
SELECT EmployeeNo,FirstName,LastName
FROM Employee;
Lorsque cette requête est exécutée, elle extrait les colonnes EmployeeNo, FirstName et LastName de la table Employee.
EmployeeNo FirstName LastName
----------- ------------------------------ ---------------------------
101 Mike James
104 Alex Stuart
102 Robert Williams
105 Robert James
103 Peter Paul
Si vous souhaitez récupérer toutes les colonnes d'une table, vous pouvez utiliser la commande suivante au lieu de lister toutes les colonnes.
SELECT * FROM Employee;
La requête ci-dessus récupérera tous les enregistrements de la table des employés.
Clause WHERE
La clause WHERE est utilisée pour filtrer les enregistrements renvoyés par l'instruction SELECT. Une condition est associée à la clause WHERE. Seuls, les enregistrements qui satisfont à la condition de la clause WHERE sont renvoyés.
Syntaxe
Voici la syntaxe de l'instruction SELECT avec la clause WHERE.
SELECT * FROM tablename
WHERE[condition];
Exemple
La requête suivante récupère les enregistrements où EmployeeNo est 101.
SELECT * FROM Employee
WHERE EmployeeNo = 101;
Lorsque cette requête est exécutée, elle renvoie les enregistrements suivants.
EmployeeNo FirstName LastName
----------- ------------------------------ -----------------------------
101 Mike James
COMMANDÉ PAR
Lorsque l'instruction SELECT est exécutée, les lignes renvoyées ne sont pas dans un ordre spécifique. La clause ORDER BY est utilisée pour organiser les enregistrements dans l'ordre croissant / décroissant sur toutes les colonnes.
Syntaxe
Voici la syntaxe de l'instruction SELECT avec la clause ORDER BY.
SELECT * FROM tablename
ORDER BY column 1, column 2..;
Exemple
La requête suivante récupère les enregistrements de la table des employés et classe les résultats par FirstName.
SELECT * FROM Employee
ORDER BY FirstName;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
EmployeeNo FirstName LastName
----------- ------------------------------ -----------------------------
104 Alex Stuart
101 Mike James
103 Peter Paul
102 Robert Williams
105 Robert James
PAR GROUPE
La clause GROUP BY est utilisée avec l'instruction SELECT et organise les enregistrements similaires en groupes.
Syntaxe
Voici la syntaxe de l'instruction SELECT avec la clause GROUP BY.
SELECT column 1, column2 …. FROM tablename
GROUP BY column 1, column 2..;
Exemple
L'exemple suivant regroupe les enregistrements par colonne DepartmentNo et identifie le nombre total de chaque service.
SELECT DepartmentNo,Count(*) FROM
Employee
GROUP BY DepartmentNo;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
DepartmentNo Count(*)
------------ -----------
3 1
1 1
2 3
Teradata prend en charge les opérateurs logiques et conditionnels suivants. Ces opérateurs sont utilisés pour effectuer des comparaisons et combiner plusieurs conditions.
Syntaxe | Sens |
---|---|
> | Plus grand que |
< | Moins que |
>= | Plus grand ou égal à |
<= | Inférieur ou égal à |
= | Égal à |
BETWEEN | Si les valeurs dans la plage |
IN | Si les valeurs dans <expression> |
NOT IN | Si les valeurs ne sont pas dans <expression> |
IS NULL | Si la valeur est NULL |
IS NOT NULL | Si la valeur n'est PAS NULL |
AND | Combinez plusieurs conditions. Évalue à vrai uniquement si toutes les conditions sont remplies |
OR | Combinez plusieurs conditions. Évalue à vrai uniquement si l'une des conditions est remplie. |
NOT | Inverse le sens de la condition |
ENTRE
La commande BETWEEN est utilisée pour vérifier si une valeur se trouve dans une plage de valeurs.
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementNon | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
102 | Robert | Williams | 25/04/2007 | 2 | 05/03/1983 |
103 | Peter | Paul | 21/03/2007 | 2 | 01/04/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 06/11/1984 |
105 | Robert | James | 1/4/2008 | 3 | 01/12/1984 |
L'exemple suivant récupère les enregistrements avec des numéros d'employés compris entre 101,102 et 103.
SELECT EmployeeNo, FirstName FROM
Employee
WHERE EmployeeNo BETWEEN 101 AND 103;
Lorsque la requête ci-dessus est exécutée, elle renvoie les enregistrements d'employés dont le numéro d'employé est compris entre 101 et 103.
*** Query completed. 3 rows found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName
----------- ------------------------------
101 Mike
102 Robert
103 Peter
DANS
La commande IN est utilisée pour vérifier la valeur par rapport à une liste de valeurs donnée.
Exemple
L'exemple suivant récupère les enregistrements avec les numéros d'employés 101, 102 et 103.
SELECT EmployeeNo, FirstName FROM
Employee
WHERE EmployeeNo in (101,102,103);
La requête ci-dessus renvoie les enregistrements suivants.
*** Query completed. 3 rows found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName
----------- ------------------------------
101 Mike
102 Robert
103 Peter
PAS DEDANS
La commande NOT IN inverse le résultat de la commande IN. Il récupère les enregistrements dont les valeurs ne correspondent pas à la liste donnée.
Exemple
L'exemple suivant récupère les enregistrements dont les numéros d'employés ne figurent pas dans 101, 102 et 103.
SELECT * FROM
Employee
WHERE EmployeeNo not in (101,102,103);
La requête ci-dessus renvoie les enregistrements suivants.
*** Query completed. 2 rows found. 6 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName LastName
----------- ------------------------------ -----------------------------
104 Alex Stuart
105 Robert James
Les opérateurs SET combinent les résultats de plusieurs instructions SELECT. Cela peut ressembler à Joins, mais les jointures combinent des colonnes de plusieurs tables, tandis que les opérateurs SET combinent des lignes de plusieurs lignes.
Règles
Le nombre de colonnes de chaque instruction SELECT doit être le même.
Les types de données de chaque SELECT doivent être compatibles.
ORDER BY doit être inclus uniquement dans l'instruction SELECT finale.
SYNDICAT
L'instruction UNION est utilisée pour combiner les résultats de plusieurs instructions SELECT. Il ignore les doublons.
Syntaxe
Voici la syntaxe de base de l'instruction UNION.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
UNION
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Exemple
Considérez le tableau des employés et le tableau des salaires suivants.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementNon | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
102 | Robert | Williams | 25/04/2007 | 2 | 05/03/1983 |
103 | Peter | Paul | 21/03/2007 | 2 | 01/04/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 06/11/1984 |
105 | Robert | James | 1/4/2008 | 3 | 01/12/1984 |
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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 requête UNION suivante combine la valeur EmployeeNo de la table Employee et Salary.
SELECT EmployeeNo
FROM
Employee
UNION
SELECT EmployeeNo
FROM
Salary;
Lorsque la requête est exécutée, elle produit la sortie suivante.
EmployeeNo
-----------
101
102
103
104
105
UNION TOUT
L'instruction UNION ALL est similaire à UNION, elle combine les résultats de plusieurs tables, y compris les lignes en double.
Syntaxe
Voici la syntaxe de base de l'instruction UNION ALL.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
UNION ALL
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Exemple
Voici un exemple pour l'instruction UNION ALL.
SELECT EmployeeNo
FROM
Employee
UNION ALL
SELECT EmployeeNo
FROM
Salary;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. Vous pouvez voir qu'il renvoie également les doublons.
EmployeeNo
-----------
101
104
102
105
103
101
104
102
103
COUPER
La commande INTERSECT est également utilisée pour combiner les résultats de plusieurs instructions SELECT. Il renvoie les lignes de la première instruction SELECT qui a une correspondance correspondante dans les secondes instructions SELECT. En d'autres termes, il renvoie les lignes qui existent dans les deux instructions SELECT.
Syntaxe
Voici la syntaxe de base de l'instruction INTERSECT.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
INTERSECT
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Exemple
Voici un exemple de déclaration INTERSECT. Il renvoie les valeurs EmployeeNo qui existent dans les deux tables.
SELECT EmployeeNo
FROM
Employee
INTERSECT
SELECT EmployeeNo
FROM
Salary;
Lorsque la requête ci-dessus est exécutée, elle renvoie les enregistrements suivants. EmployeeNo 105 est exclu car il n'existe pas dans la table SALARY.
EmployeeNo
-----------
101
104
102
103
MOINS / SAUF
Les commandes MINUS / EXCEPT combinent les lignes de plusieurs tables et retournent les lignes qui se trouvent dans le premier SELECT mais pas dans le second SELECT. Ils renvoient tous les deux les mêmes résultats.
Syntaxe
Voici la syntaxe de base de l'instruction MINUS.
SELECT col1, col2, col3…
FROM
<table 1>
[WHERE condition]
MINUS
SELECT col1, col2, col3…
FROM
<table 2>
[WHERE condition];
Exemple
Voici un exemple de déclaration MINUS.
SELECT EmployeeNo
FROM
Employee
MINUS
SELECT EmployeeNo
FROM
Salary;
Lorsque cette requête est exécutée, elle renvoie l'enregistrement suivant.
EmployeeNo
-----------
105
Teradata fournit plusieurs fonctions pour manipuler les chaînes. Ces fonctions sont compatibles avec la norme ANSI.
Sr.Non | Fonction de chaîne et description |
---|---|
1 | || Concatène les chaînes ensemble |
2 | SUBSTR Extrait une partie d'une chaîne (extension Teradata) |
3 | SUBSTRING Extrait une partie d'une chaîne (norme ANSI) |
4 | INDEX Localise la position d'un caractère dans une chaîne (extension Teradata) |
5 | POSITION Localise la position d'un caractère dans une chaîne (norme ANSI) |
6 | TRIM Coupe les blancs d'une chaîne |
sept | UPPER Convertit une chaîne en majuscules |
8 | LOWER Convertit une chaîne en minuscules |
Exemple
Le tableau suivant répertorie certaines des fonctions de chaîne avec les résultats.
Fonction de chaîne | Résultat |
---|---|
SELECT SUBSTRING ('entrepôt' DE 1 POUR 4) | articles |
SELECT SUBSTR ('entrepôt', 1,4) | articles |
SELECT "données" || '' || 'entrepôt' | entrepôt de données |
SELECT UPPER ('données') | LES DONNÉES |
SÉLECTIONNER INFÉRIEUR ('DONNÉES') | Les données |
Ce chapitre traite des fonctions de date / heure disponibles dans Teradata.
Stockage de la date
Les dates sont stockées sous forme d'entiers en interne à l'aide de la formule suivante.
((YEAR - 1900) * 10000) + (MONTH * 100) + DAY
Vous pouvez utiliser la requête suivante pour vérifier comment les dates sont stockées.
SELECT CAST(CURRENT_DATE AS INTEGER);
Les dates étant stockées sous forme d'entiers, vous pouvez effectuer certaines opérations arithmétiques sur elles. Teradata fournit des fonctions pour effectuer ces opérations.
EXTRAIT
La fonction EXTRACT extrait des parties du jour, du mois et de l'année à partir d'une valeur DATE. Cette fonction est également utilisée pour extraire les heures, les minutes et les secondes de la valeur TIME / TIMESTAMP.
Exemple
Les exemples suivants montrent comment extraire les valeurs Année, Mois, Date, Heure, Minute et Seconde des valeurs Date et Horodatage.
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
INTERVALLE
Teradata fournit la fonction INTERVAL pour effectuer des opérations arithmétiques sur les valeurs DATE et TIME. Il existe deux types de fonctions INTERVAL.
Intervalle année-mois
- YEAR
- ANNÉE AU MOIS
- MONTH
Intervalle jour-heure
- DAY
- JOUR À HEURE
- JOUR À MINUTE
- JOUR À DEUXIÈME
- HOUR
- HEURE EN MINUTE
- HEURE À SECONDE
- MINUTE
- MINUTE À SECONDE
- SECOND
Exemple
L'exemple suivant ajoute 3 ans à la date actuelle.
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03' YEAR;
Date (Date+ 3)
-------- ---------
16/01/01 19/01/01
L'exemple suivant ajoute 3 ans et 01 mois à la date actuelle.
SELECT CURRENT_DATE, CURRENT_DATE + INTERVAL '03-01' YEAR TO MONTH;
Date (Date+ 3-01)
-------- ------------
16/01/01 19/02/01
L'exemple suivant ajoute 01 jour, 05 heures et 10 minutes à l'horodatage actuel.
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 fournit des fonctions intégrées qui sont des extensions de SQL. Voici les fonctions intégrées courantes.
Fonction | Résultat |
---|---|
SÉLECTIONNER UNE DATE; | Date -------- 16/01/01 |
SELECT CURRENT_DATE; | Date -------- 16/01/01 |
CHOISISSEZ L'HEURE; | Heure -------- 04:50:29 |
SELECT CURRENT_TIME; | Heure -------- 04:50:29 |
SELECT CURRENT_TIMESTAMP; | Horodatage actuel (6) -------------------------------- 01/01/2016 04: 51: 06.990000 + 00: 00 |
SELECT DATABASE; | Base de données ------------------------------ TDUSER |
Teradata prend en charge les fonctions d'agrégation courantes. Ils peuvent être utilisés avec l'instruction SELECT.
COUNT - Compte les lignes
SUM - Résume les valeurs de la ou des colonnes spécifiées
MAX - Renvoie la grande valeur de la colonne spécifiée
MIN - Renvoie la valeur minimale de la colonne spécifiée
AVG - Renvoie la valeur moyenne de la colonne spécifiée
Exemple
Considérez le tableau des salaires suivant.
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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 |
COMPTER
L'exemple suivant compte le nombre d'enregistrements dans la table Salary.
SELECT count(*) from Salary;
Count(*)
-----------
5
MAX
L'exemple suivant renvoie la valeur salariale nette maximale de l'employé.
SELECT max(NetPay) from Salary;
Maximum(NetPay)
---------------------
83000
MIN
L'exemple suivant renvoie la valeur du salaire net minimum de l'employé à partir de la table Salary.
SELECT min(NetPay) from Salary;
Minimum(NetPay)
---------------------
36000
AVG
L'exemple suivant renvoie la valeur moyenne du salaire net des employés à partir de la table.
SELECT avg(NetPay) from Salary;
Average(NetPay)
---------------------
65800
SOMME
L'exemple suivant calcule la somme du salaire net des employés à partir de tous les enregistrements de la table Salary.
SELECT sum(NetPay) from Salary;
Sum(NetPay)
-----------------
329000
Ce chapitre explique les fonctions CASE et COALESCE de Teradata.
Expression CASE
L'expression CASE évalue chaque ligne par rapport à une condition ou à une clause WHEN et renvoie le résultat de la première correspondance. S'il n'y a pas de correspondance, le résultat de la partie ELSE est renvoyé.
Syntaxe
Voici la syntaxe de l'expression CASE.
CASE <expression>
WHEN <expression> THEN result-1
WHEN <expression> THEN result-2
ELSE
Result-n
END
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementNon | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
102 | Robert | Williams | 25/04/2007 | 2 | 05/03/1983 |
103 | Peter | Paul | 21/03/2007 | 2 | 01/04/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 06/11/1984 |
105 | Robert | James | 1/4/2008 | 3 | 01/12/1984 |
L'exemple suivant évalue la colonne DepartmentNo et renvoie la valeur 1 si le numéro de service est 1; renvoie 2 si le numéro de département est 3; sinon, il renvoie la valeur en tant que département non valide.
SELECT
EmployeeNo,
CASE DepartmentNo
WHEN 1 THEN 'Admin'
WHEN 2 THEN 'IT'
ELSE 'Invalid Dept'
END AS Department
FROM Employee;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
*** 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'expression CASE ci-dessus peut également être écrite sous la forme suivante qui produira le même résultat que ci-dessus.
SELECT
EmployeeNo,
CASE
WHEN DepartmentNo = 1 THEN 'Admin'
WHEN DepartmentNo = 2 THEN 'IT'
ELSE 'Invalid Dept'
END AS Department
FROM Employee;
SE FONDRE
COALESCE est une instruction qui renvoie la première valeur non nulle de l'expression. Il renvoie NULL si tous les arguments de l'expression sont évalués à NULL. Voici la syntaxe.
Syntaxe
COALESCE(expression 1, expression 2, ....)
Exemple
SELECT
EmployeeNo,
COALESCE(dept_no, 'Department not found')
FROM
employee;
NULLIF
L'instruction NULLIF renvoie NULL si les arguments sont égaux.
Syntaxe
Voici la syntaxe de l'instruction NULLIF.
NULLIF(expression 1, expression 2)
Exemple
L'exemple suivant renvoie NULL si DepartmentNo est égal à 3. Sinon, il renvoie la valeur DepartmentNo.
SELECT
EmployeeNo,
NULLIF(DepartmentNo,3) AS department
FROM Employee;
La requête ci-dessus renvoie les enregistrements suivants. Vous pouvez voir que l'employé 105 a le département no. comme 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'index principal est utilisé pour spécifier l'emplacement des données dans Teradata. Il est utilisé pour spécifier quel AMP obtient la ligne de données. Chaque table de Teradata doit avoir un index principal défini. Si l'index principal n'est pas défini, Teradata attribue automatiquement l'index principal. L'index primaire fournit le moyen le plus rapide d'accéder aux données. Un primaire peut avoir un maximum de 64 colonnes.
L'index primaire est défini lors de la création d'une table. Il existe 2 types d'index primaires.
- Index primaire unique (UPI)
- Index primaire non unique (NUPI)
Index primaire unique (UPI)
Si la table est définie comme ayant UPI, la colonne considérée comme UPI ne doit pas avoir de valeurs en double. Si des valeurs en double sont insérées, elles seront rejetées.
Créer un index primaire unique
L'exemple suivant crée la table Salary avec la colonne EmployeeNo en tant qu'index principal unique.
CREATE SET TABLE Salary (
EmployeeNo INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
UNIQUE PRIMARY INDEX(EmployeeNo);
Index primaire non unique (NUPI)
Si la table est définie comme ayant NUPI, la colonne considérée comme UPI peut accepter des valeurs en double.
Créer un index primaire non unique
L'exemple suivant crée la table des comptes d'employés avec la colonne EmployeeNo comme index primaire non unique. EmployeeNo est défini comme un index primaire non unique car un employé peut avoir plusieurs comptes dans la table; un pour le compte de salaire et un autre pour le compte de remboursement.
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 est utilisé pour combiner des enregistrements de plusieurs tables. Les tables sont jointes en fonction des colonnes / valeurs communes de ces tables.
Il existe différents types de jointures disponibles.
- Jointure interne
- Jointure externe gauche
- Jointure externe droite
- Jointure externe complète
- Auto-rejoindre
- Jointure croisée
- Jointure de production cartésienne
JOINTURE INTERNE
Inner Join combine les enregistrements de plusieurs tables et renvoie les valeurs qui existent dans les deux tables.
Syntaxe
Voici la syntaxe de l'instruction INNER JOIN.
SELECT col1, col2, col3….
FROM
Table-1
INNER JOIN
Table-2
ON (col1 = col2)
<WHERE condition>;
Exemple
Considérez le tableau des employés et le tableau des salaires suivants.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementNon | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
102 | Robert | Williams | 25/04/2007 | 2 | 05/03/1983 |
103 | Peter | Paul | 21/03/2007 | 2 | 01/04/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 06/11/1984 |
105 | Robert | James | 1/4/2008 | 3 | 01/12/1984 |
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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 requête suivante joint la table Employee et la table Salary sur la colonne commune EmployeeNo. Chaque table se voit attribuer un alias A & B et les colonnes sont référencées avec l'alias correct.
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay
FROM
Employee A
INNER JOIN
Salary B
ON (A.EmployeeNo = B. EmployeeNo);
Lorsque la requête ci-dessus est exécutée, elle renvoie les enregistrements suivants. L'employé 105 n'est pas inclus dans le résultat car il n'a pas d'enregistrements correspondants dans la table Salaire.
*** 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
JOINTURE EXTÉRIEURE
LEFT OUTER JOIN et RIGHT OUTER JOIN combinent également les résultats de plusieurs tables.
LEFT OUTER JOIN renvoie tous les enregistrements de la table de gauche et renvoie uniquement les enregistrements correspondants de la table de droite.
RIGHT OUTER JOIN renvoie tous les enregistrements de la table de droite et ne renvoie que les lignes correspondantes de la table de gauche.
FULL OUTER JOINcombine les résultats des JOINTES EXTÉRIEURES GAUCHE et DROITE. Il renvoie à la fois les lignes correspondantes et non correspondantes des tables jointes.
Syntaxe
Voici la syntaxe de l'instruction OUTER JOIN. Vous devez utiliser l'une des options de jointure externe gauche, jointure externe droite ou jointure externe complète.
SELECT col1, col2, col3….
FROM
Table-1
LEFT OUTER JOIN/RIGHT OUTER JOIN/FULL OUTER JOIN
Table-2
ON (col1 = col2)
<WHERE condition>;
Exemple
Prenons l'exemple suivant de la requête LEFT OUTER JOIN. Il renvoie tous les enregistrements de la table Employee et les enregistrements correspondants de la table 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;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. Pour l'employé 105, la valeur NetPay est NULL, car il n'a pas d'enregistrements correspondants dans la table 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 ?
JOINDRE CROISÉ
La jointure croisée joint chaque ligne de la table de gauche à chaque ligne de la table de droite.
Syntaxe
Voici la syntaxe de l'instruction 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;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. L'employé n ° 101 de la table des employés est joint à chaque enregistrement de la table des salaires.
*** 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
Une sous-requête renvoie les enregistrements d'une table en fonction des valeurs d'une autre table. Il s'agit d'une requête SELECT dans une autre requête. La requête SELECT appelée comme requête interne est exécutée en premier et le résultat est utilisé par la requête externe. Certaines de ses principales caractéristiques sont -
Une requête peut avoir plusieurs sous-requêtes et les sous-requêtes peuvent contenir une autre sous-requête.
Les sous-requêtes ne renvoient pas les enregistrements en double.
Si la sous-requête ne renvoie qu'une seule valeur, vous pouvez utiliser l'opérateur = pour l'utiliser avec la requête externe. S'il renvoie plusieurs valeurs, vous pouvez utiliser IN ou NOT IN.
Syntaxe
Voici la syntaxe générique des sous-requêtes.
SELECT col1, col2, col3,…
FROM
Outer Table
WHERE col1 OPERATOR ( Inner SELECT Query);
Exemple
Considérez le tableau des salaires suivant.
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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 requête suivante identifie le numéro d'employé avec le salaire le plus élevé. Le SELECT interne exécute la fonction d'agrégation pour renvoyer la valeur NetPay maximale et la requête SELECT externe utilise cette valeur pour renvoyer l'enregistrement d'employé avec cette valeur.
SELECT EmployeeNo, NetPay
FROM Salary
WHERE NetPay =
(SELECT MAX(NetPay)
FROM Salary);
Lorsque cette requête est exécutée, elle produit la sortie suivante.
*** Query completed. One row found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo NetPay
----------- -----------
103 83000
Teradata prend en charge les types de table suivants pour contenir des données temporaires.
- Table dérivée
- Table volatile
- Table temporaire globale
Table dérivée
Les tables dérivées sont créées, utilisées et supprimées dans une requête. Ceux-ci sont utilisés pour stocker les résultats intermédiaires dans une requête.
Exemple
L'exemple suivant crée une table dérivée EmpSal avec des enregistrements d'employés dont le salaire est supérieur à 75 000.
SELECT
Emp.EmployeeNo,
Emp.FirstName,
Empsal.NetPay
FROM
Employee Emp,
(select EmployeeNo , NetPay
from Salary
where NetPay >= 75000) Empsal
where Emp.EmployeeNo = Empsal.EmployeeNo;
Lorsque la requête ci-dessus est exécutée, elle renvoie les employés dont le salaire est supérieur à 75 000.
*** Query completed. One row found. 3 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo FirstName NetPay
----------- ------------------------------ -----------
103 Peter 83000
Table volatile
Les tables volatiles sont créées, utilisées et supprimées dans une session utilisateur. Leur définition n'est pas stockée dans le dictionnaire de données. Ils contiennent des données intermédiaires de la requête fréquemment utilisées. Voici la syntaxe.
Syntaxe
CREATE [SET|MULTISET] VOALTILE TABLE tablename
<table definitions>
<column definitions>
<index definitions>
ON COMMIT [DELETE|PRESERVE] ROWS
Exemple
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;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
*** Table has been created.
*** Total elapsed time was 1 second.
Table temporaire globale
La définition de la table temporaire globale est stockée dans le dictionnaire de données et peut être utilisée par de nombreux utilisateurs / sessions. Mais les données chargées dans la table temporaire globale ne sont conservées que pendant la session. Vous pouvez matérialiser jusqu'à 2000 tables temporaires globales par session. Voici la syntaxe.
Syntaxe
CREATE [SET|MULTISET] GLOBAL TEMPORARY TABLE tablename
<table definitions>
<column definitions>
<index definitions>
Exemple
CREATE SET GLOBAL TEMPORARY TABLE dept_stat (
dept_no INTEGER,
avg_salary INTEGER,
max_salary INTEGER,
min_salary INTEGER
)
PRIMARY INDEX(dept_no);
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
*** Table has been created.
*** Total elapsed time was 1 second.
Il existe trois types d'espaces disponibles à Teradata.
Espace permanent
L'espace permanent est la quantité maximale d'espace disponible pour que l'utilisateur / la base de données contienne des lignes de données. Les tables permanentes, les journaux, les tables de secours et les sous-tables d'index secondaires utilisent un espace permanent.
L'espace permanent n'est pas pré-alloué pour la base de données / l'utilisateur. Ils sont simplement définis comme la quantité maximale d'espace que la base de données / l'utilisateur peut utiliser. La quantité d'espace permanent est divisée par le nombre de SAP. Chaque fois que la limite AMP dépasse, un message d'erreur est généré.
Espace de bobine
L'espace de spoule est l'espace permanent inutilisé utilisé par le système pour conserver les résultats intermédiaires de la requête SQL. Les utilisateurs sans espace de spoule ne peuvent exécuter aucune requête.
Semblable à l'espace permanent, l'espace spool définit la quantité maximale d'espace que l'utilisateur peut utiliser. L'espace de spool est divisé par le nombre d'AMP. Chaque fois que la limite AMP dépasse, l'utilisateur obtiendra une erreur d'espace de spoule.
Espace temporaire
L'espace temporaire est l'espace permanent inutilisé utilisé par les tables temporaires globales. L'espace temporaire est également divisé par le nombre d'AMP.
Une table ne peut contenir qu'un seul index primaire. Le plus souvent, vous rencontrerez des scénarios dans lesquels la table contient d'autres colonnes, à l'aide desquelles les données sont fréquemment consultées. Teradata effectuera une analyse complète de la table pour ces requêtes. Les index secondaires résolvent ce problème.
Les index secondaires sont un autre chemin d'accès aux données. Il existe quelques différences entre l'index primaire et l'index secondaire.
L'index secondaire n'est pas impliqué dans la distribution des données.
Les valeurs d'index secondaires sont stockées dans des sous-tables. Ces tableaux sont intégrés à tous les AMP.
Les index secondaires sont facultatifs.
Ils peuvent être créés lors de la création d'une table ou après la création d'une table.
Ils occupent un espace supplémentaire car ils construisent des sous-tableaux et ils nécessitent également une maintenance puisque les sous-tableaux doivent être mis à jour pour chaque nouvelle ligne.
Il existe deux types d'index secondaires -
- Indice secondaire unique (USI)
- Index secondaire non unique (NUSI)
Indice secondaire unique (USI)
Un index secondaire unique autorise uniquement des valeurs uniques pour les colonnes définies comme USI. L'accès à la ligne par USI est une opération à deux ampères.
Créer un index secondaire unique
L'exemple suivant crée USI sur la colonne EmployeeNo de la table employee.
CREATE UNIQUE INDEX(EmployeeNo) on employee;
Index secondaire non unique (NUSI)
Un index secondaire non unique permet des valeurs en double pour les colonnes définies comme NUSI. L'accès à la ligne par NUSI est une opération tout ampli.
Créer un index secondaire non unique
L'exemple suivant crée NUSI sur la colonne FirstName de la table des employés.
CREATE INDEX(FirstName) on Employee;
L'optimiseur Teradata propose une stratégie d'exécution pour chaque requête SQL. Cette stratégie d'exécution est basée sur les statistiques collectées sur les tables utilisées dans la requête SQL. Les statistiques sur la table sont collectées à l'aide de la commande COLLECT STATISTICS. L'optimiseur a besoin d'informations sur l'environnement et de données démographiques pour proposer une stratégie d'exécution optimale.
Informations sur l'environnement
- Nombre de nœuds, d'AMP et de processeurs
- Quantité de mémoire
Données démographiques
- Nombre de rangées
- Taille de ligne
- Plage de valeurs dans le tableau
- Nombre de lignes par valeur
- Nombre de valeurs nulles
Il existe trois approches pour recueillir des statistiques sur la table.
- Échantillonnage AMP aléatoire
- Collection complète de statistiques
- Utilisation de l'option SAMPLE
Collecte de statistiques
La commande COLLECT STATISTICS est utilisée pour collecter des statistiques sur une table.
Syntaxe
Voici la syntaxe de base pour collecter des statistiques sur une table.
COLLECT [SUMMARY] STATISTICS
INDEX (indexname) COLUMN (columnname)
ON <tablename>;
Exemple
L'exemple suivant collecte des statistiques sur la colonne EmployeeNo de la table Employee.
COLLECT STATISTICS COLUMN(EmployeeNo) ON Employee;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
*** Update completed. 2 rows changed.
*** Total elapsed time was 1 second.
Affichage des statistiques
Vous pouvez afficher les statistiques collectées à l'aide de la commande HELP STATISTICS.
Syntaxe
Voici la syntaxe pour afficher les statistiques collectées.
HELP STATISTICS <tablename>;
Exemple
Voici un exemple pour afficher les statistiques collectées sur la table Employee.
HELP STATISTICS employee;
Lorsque la requête ci-dessus est exécutée, elle produit le résultat suivant.
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 compression est utilisée pour réduire le stockage utilisé par les tables. Dans Teradata, la compression peut compresser jusqu'à 255 valeurs distinctes, y compris NULL. Le stockage étant réduit, Teradata peut stocker plus d'enregistrements dans un bloc. Cela améliore le temps de réponse aux requêtes, car toute opération d'E / S peut traiter plus de lignes par bloc. La compression peut être ajoutée à la création de la table à l'aide de CREATE TABLE ou après la création de la table à l'aide de la commande ALTER TABLE.
Limites
- Seules 255 valeurs peuvent être compressées par colonne.
- La colonne d'index primaire ne peut pas être compressée.
- Les tables volatiles ne peuvent pas être compressées.
Compression à valeurs multiples (MVC)
Le tableau suivant compresse le champ DepatmentNo pour les valeurs 1, 2 et 3. Lorsque la compression est appliquée à une colonne, les valeurs de cette colonne ne sont pas stockées avec la ligne. Au lieu de cela, les valeurs sont stockées dans l'en-tête Table de chaque AMP et seuls les bits de présence sont ajoutés à la ligne pour indiquer la valeur.
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 compression à valeurs multiples peut être utilisée lorsque vous avez une colonne dans une grande table avec des valeurs finies.
La commande EXPLAIN renvoie le plan d'exécution du moteur d'analyse en anglais. Il peut être utilisé avec n'importe quelle instruction SQL sauf sur une autre commande EXPLAIN. Lorsqu'une requête est précédée de la commande EXPLAIN, le plan d'exécution du moteur d'analyse est renvoyé à l'utilisateur au lieu des AMP.
Exemples d'EXPLAIN
Considérez la table Employee avec la définition suivante.
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 );
Quelques exemples de plan EXPLAIN sont donnés ci-dessous.
Balayage complet de la table (FTS)
Lorsqu'aucune condition n'est spécifiée dans l'instruction SELECT, l'optimiseur peut choisir d'utiliser l'analyse complète de la table où chaque ligne de la table est accessible.
Exemple
Voici un exemple de requête dans lequel l'optimiseur peut choisir FTS.
EXPLAIN SELECT * FROM employee;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. Comme on peut le voir, l'optimiseur choisit d'accéder à tous les AMP et à toutes les lignes de l'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.
Index primaire unique
Lorsque les lignes sont accessibles à l'aide d'un index primaire unique, il s'agit d'une opération AMP.
EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. Comme on peut le voir, il s'agit d'une extraction à un seul AMP et l'optimiseur utilise l'index principal unique pour accéder à la ligne.
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.
Index secondaire unique
Lorsque les lignes sont accessibles à l'aide de l'index secondaire unique, il s'agit d'une opération à deux ampères.
Exemple
Considérez le tableau Salaire avec la définition suivante.
CREATE SET TABLE SALARY,FALLBACK (
EmployeeNo INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
PRIMARY INDEX ( EmployeeNo )
UNIQUE INDEX (EmployeeNo);
Considérez l'instruction SELECT suivante.
EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. Comme on peut le voir, l'optimiseur récupère la ligne dans une opération à deux ampères à l'aide d'un index secondaire unique.
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.
Conditions supplémentaires
Voici la liste des termes couramment utilisés dans le plan EXPLAIN.
... (Last Use) …
Un fichier spoule n'est plus nécessaire et sera libéré lorsque cette étape sera terminée.
... with no residual conditions …
Toutes les conditions applicables ont été appliquées aux lignes.
... END TRANSACTION …
Les verrous de transaction sont libérés et les modifications sont validées.
... eliminating duplicate rows ...
Les lignes en double existent uniquement dans les fichiers spool, pas dans les tables définies. Effectuer une opération DISTINCT.
... by way of a traversal of index #n extracting row ids only …
Un fichier spoule est généré contenant les ID de ligne trouvés dans un index secondaire (index #n)
... we do a SMS (set manipulation step) …
Combinaison de lignes à l'aide d'un opérateur UNION, MINUS ou INTERSECT.
... which is redistributed by hash code to all AMPs.
Redistribution des données en préparation d'une jointure.
... which is duplicated on all AMPs.
Duplication des données de la table plus petite (en termes de SPOOL) en vue d'une jointure.
... (one_AMP) or (group_AMPs)
Indique qu'un AMP ou un sous-ensemble d'AMP sera utilisé à la place de tous les AMP.
Une ligne est attribuée à un AMP particulier en fonction de la valeur d'index primaire. Teradata utilise un algorithme de hachage pour déterminer quel AMP obtient la ligne.
Voici un diagramme de haut niveau sur l'algorithme de hachage.
Voici les étapes pour insérer les données.
Le client soumet une requête.
L'analyseur reçoit la requête et transmet la valeur PI de l'enregistrement à l'algorithme de hachage.
L'algorithme de hachage hache la valeur d'index primaire et renvoie un nombre de 32 bits, appelé Row Hash.
Les bits d'ordre supérieur du hachage de ligne (16 premiers bits) sont utilisés pour identifier l'entrée de mappe de hachage. La carte de hachage contient un AMP #. La carte de hachage est un tableau de buckets contenant un numéro AMP spécifique.
BYNET envoie les données à l'AMP identifié.
AMP utilise le hachage de ligne 32 bits pour localiser la ligne sur son disque.
S'il existe un enregistrement avec le même hachage de ligne, il incrémente l'ID d'unicité qui est un nombre de 32 bits. Pour le nouveau hachage de ligne, l'ID d'unicité est attribué à 1 et incrémenté chaque fois qu'un enregistrement avec le même hachage de ligne est inséré.
La combinaison du hachage de ligne et de l'ID d'unicité est appelée ID de ligne.
L'ID de ligne préfixe chaque enregistrement du disque.
Chaque ligne de table dans l'AMP est triée logiquement en fonction de leurs ID de ligne.
Comment les tables sont stockées
Les tables sont triées par leur ID de ligne (hachage de ligne + ID d'unicité), puis stockées dans les AMP. L'ID de ligne est stocké avec chaque ligne de données.
Hash de ligne | ID d'unicité | Numéro d'employé | Prénom | Nom de famille |
---|---|---|---|---|
2A01 2611 | 0000 0001 | 101 | Mike | James |
2A01 2612 | 0000 0001 | 104 | Alex | Stuart |
2A01 2613 | 0000 0001 | 102 | Robert | Williams |
2A01 2614 | 0000 0001 | 105 | Robert | James |
2A01 2615 | 0000 0001 | 103 | Peter | Paul |
JOIN INDEX est une vue matérialisée. Sa définition est stockée en permanence et les données sont mises à jour chaque fois que les tables de base référencées dans l'index de jointure sont mises à jour. JOIN INDEX peut contenir une ou plusieurs tables et également des données pré-agrégées. Les index de jointure sont principalement utilisés pour améliorer les performances.
Il existe différents types d'index de jointure disponibles.
- Index de jointure de table unique (STJI)
- Index de jointure multi-table (MTJI)
- Index de jointure agrégé (AJI)
Index de jointure de table unique
L'index de jointure de table unique permet de partitionner une grande table en fonction des différentes colonnes d'index primaire que celle de la table de base.
Syntaxe
Voici la syntaxe d'un JOIN INDEX.
CREATE JOIN INDEX <index name>
AS
<SELECT Query>
<Index Definition>;
Exemple
Considérez les tableaux des employés et des salaires suivants.
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);
Voici un exemple qui crée un index de jointure nommé Employee_JI sur la table Employee.
CREATE JOIN INDEX Employee_JI
AS
SELECT EmployeeNo,FirstName,LastName,
BirthDate,JoinedDate,DepartmentNo
FROM Employee
PRIMARY INDEX(FirstName);
Si l'utilisateur soumet une requête avec une clause WHERE sur EmployeeNo, le système interrogera la table Employee à l'aide de l'index primaire unique. Si l'utilisateur interroge la table des employés en utilisant nom_employé, le système peut accéder à l'index de jointure Employee_JI en utilisant nom_employé. Les lignes de l'index de jointure sont hachées sur la colonne nom_employé. Si l'index de jointure n'est pas défini et que le nom_employé n'est pas défini comme index secondaire, le système effectuera une analyse complète de la table pour accéder aux lignes, ce qui prend du temps.
Vous pouvez exécuter le plan EXPLAIN suivant et vérifier le plan d'optimisation. Dans l'exemple suivant, vous pouvez voir que l'optimiseur utilise l'index de jointure au lieu de la table Employee de base lorsque la table interroge à l'aide de la colonne 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.
Index de jointure multi-table
Un index de jointure multi-table est créé en joignant plusieurs tables. L'index de jointure multi-table peut être utilisé pour stocker le jeu de résultats des tables fréquemment jointes afin d'améliorer les performances.
Exemple
L'exemple suivant crée un JOIN INDEX nommé Employee_Salary_JI en joignant les tables Employee et 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);
Chaque fois que les tables de base Employee ou Salary sont mises à jour, l'index de jointure Employee_Salary_JI est également mis à jour automatiquement. Si vous exécutez une requête joignant les tables Employee et Salary, l'optimiseur peut choisir d'accéder directement aux données de Employee_Salary_JI au lieu de joindre les tables. Le plan EXPLAIN sur la requête peut être utilisé pour vérifier si l'optimiseur choisira la table de base ou l'index de jointure.
Index de jointure agrégé
Si une table est agrégée de manière cohérente sur certaines colonnes, un index de jointure agrégé peut être défini sur la table pour améliorer les performances. Une limitation de l'index de jointure agrégé est qu'il prend en charge uniquement les fonctions SUM et COUNT.
Exemple
Dans l'exemple suivant, l'employé et le salaire sont joints pour identifier le salaire total par service.
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);
Les vues sont des objets de base de données créés par la requête. Les vues peuvent être créées à l'aide d'une seule table ou de plusieurs tables par voie de jointure. Leur définition est stockée en permanence dans le dictionnaire de données mais ils ne stockent pas de copie des données. Les données de la vue sont créées dynamiquement.
Une vue peut contenir un sous-ensemble de lignes de la table ou un sous-ensemble de colonnes de la table.
Créer une vue
Les vues sont créées à l'aide de l'instruction CREATE VIEW.
Syntaxe
Voici la syntaxe pour créer une vue.
CREATE/REPLACE VIEW <viewname>
AS
<select query>;
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | Date de naissance |
---|---|---|---|
101 | Mike | James | 05/01/1980 |
104 | Alex | Stuart | 06/11/1984 |
102 | Robert | Williams | 05/03/1983 |
105 | Robert | James | 01/12/1984 |
103 | Peter | Paul | 01/04/1983 |
L'exemple suivant crée une vue sur la table Employee.
CREATE VIEW Employee_View
AS
SELECT
EmployeeNo,
FirstName,
LastName,
FROM
Employee;
Utilisation des vues
Vous pouvez utiliser une instruction SELECT standard pour récupérer des données à partir de Views.
Exemple
L'exemple suivant récupère les enregistrements de Employee_View;
SELECT EmployeeNo, FirstName, LastName FROM Employee_View;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
*** 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
Modifier les vues
Une vue existante peut être modifiée à l'aide de l'instruction REPLACE VIEW.
Voici la syntaxe pour modifier une vue.
REPLACE VIEW <viewname>
AS
<select query>;
Exemple
L'exemple suivant modifie la vue Employee_View pour ajouter des colonnes supplémentaires.
REPLACE VIEW Employee_View
AS
SELECT
EmployeeNo,
FirstName,
BirthDate,
JoinedDate
DepartmentNo
FROM
Employee;
Drop View
Une vue existante peut être supprimée à l'aide de l'instruction DROP VIEW.
Syntaxe
Voici la syntaxe de DROP VIEW.
DROP VIEW <viewname>;
Exemple
Voici un exemple de suppression de la vue Employee_View.
DROP VIEW Employee_View;
Avantages des vues
Les vues offrent un niveau de sécurité supplémentaire en limitant les lignes ou les colonnes d'une table.
Les utilisateurs peuvent avoir accès uniquement aux vues au lieu des tables de base.
Simplifie l'utilisation de plusieurs tables en les joignant préalablement à l'aide de Views.
Macro est un ensemble d'instructions SQL qui sont stockées et exécutées en appelant le nom de la macro. La définition des macros est stockée dans le dictionnaire de données. Les utilisateurs n'ont besoin que du privilège EXEC pour exécuter la macro. Les utilisateurs n'ont pas besoin de privilèges distincts sur les objets de base de données utilisés dans la macro. Les instructions de macro sont exécutées en une seule transaction. Si l'une des instructions SQL de Macro échoue, toutes les instructions sont annulées. Les macros peuvent accepter des paramètres. Les macros peuvent contenir des instructions DDL, mais cela devrait être la dernière instruction de Macro.
Créer des macros
Les macros sont créées à l'aide de l'instruction CREATE MACRO.
Syntaxe
Voici la syntaxe générique de la commande CREATE MACRO.
CREATE MACRO <macroname> [(parameter1, parameter2,...)] (
<sql statements>
);
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | Date de naissance |
---|---|---|---|
101 | Mike | James | 05/01/1980 |
104 | Alex | Stuart | 06/11/1984 |
102 | Robert | Williams | 05/03/1983 |
105 | Robert | James | 01/12/1984 |
103 | Peter | Paul | 01/04/1983 |
L'exemple suivant crée une macro appelée Get_Emp. Il contient une instruction de sélection pour récupérer les enregistrements de la table des employés.
CREATE MACRO Get_Emp AS (
SELECT
EmployeeNo,
FirstName,
LastName
FROM
employee
ORDER BY EmployeeNo;
);
Exécution de macros
Les macros sont exécutées à l'aide de la commande EXEC.
Syntaxe
Voici la syntaxe de la commande EXECUTE MACRO.
EXEC <macroname>;
Exemple
L'exemple suivant exécute les noms de macro Get_Emp; Lorsque la commande suivante est exécutée, elle récupère tous les enregistrements de la table des employés.
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
Macros paramétrées
Les macros Teradata peuvent accepter des paramètres. Dans une macro, ces paramètres sont référencés avec; (point-virgule).
Voici un exemple de macro qui accepte des paramètres.
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS (
SELECT
EmployeeNo,
NetPay
FROM
Salary
WHERE EmployeeNo = :EmployeeNo;
);
Exécution de macros paramétrées
Les macros sont exécutées à l'aide de la commande EXEC. Vous avez besoin du privilège EXEC pour exécuter les macros.
Syntaxe
Voici la syntaxe de l'instruction EXECUTE MACRO.
EXEC <macroname>(value);
Exemple
L'exemple suivant exécute les noms de macro Get_Emp; Il accepte l'employé no comme paramètre et extrait les enregistrements de la table des employés pour cet employé.
EXEC Get_Emp_Salary(101);
*** Query completed. One row found. 2 columns returned.
*** Total elapsed time was 1 second.
EmployeeNo NetPay
----------- ------------
101 36000
Une procédure stockée contient un ensemble d'instructions SQL et d'instructions de procédure. Ils ne peuvent contenir que des déclarations de procédure. La définition de la procédure stockée est stockée dans la base de données et les paramètres sont stockés dans les tables de dictionnaire de données.
Avantages
Les procédures stockées réduisent la charge réseau entre le client et le serveur.
Fournit une meilleure sécurité puisque les données sont accessibles via des procédures stockées au lieu d'y accéder directement.
Donne une meilleure maintenance puisque la logique métier est testée et stockée dans le serveur.
Procédure de création
Les procédures stockées sont créées à l'aide de l'instruction CREATE PROCEDURE.
Syntaxe
Voici la syntaxe générique de l'instruction CREATE PROCEDURE.
CREATE PROCEDURE <procedurename> ( [parameter 1 data type, parameter 2 data type..] )
BEGIN
<SQL or SPL statements>;
END;
Exemple
Considérez le tableau des salaires suivant.
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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'exemple suivant crée une procédure stockée nommée InsertSalary pour accepter les valeurs et les insérer dans la table des salaires.
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;
Exécution des procédures
Les procédures stockées sont exécutées à l'aide de l'instruction CALL.
Syntaxe
Voici la syntaxe générique de l'instruction CALL.
CALL <procedure name> [(parameter values)];
Exemple
L'exemple suivant appelle la procédure stockée InsertSalary et insère des enregistrements dans la table des salaires.
CALL InsertSalary(105,20000,2000,18000);
Une fois la requête ci-dessus exécutée, elle produit la sortie suivante et vous pouvez voir la ligne insérée dans la table Salary.
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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 |
Ce chapitre présente les différentes stratégies JOIN disponibles dans Teradata.
Méthodes de jointure
Teradata utilise différentes méthodes de jointure pour effectuer des opérations de jointure. Certaines des méthodes de jointure couramment utilisées sont -
- Fusionner la jointure
- Jointure imbriquée
- Rejoindre le produit
Fusionner la jointure
La méthode Merge Join a lieu lorsque la jointure est basée sur la condition d'égalité. La jointure par fusion nécessite que les lignes de jointure soient sur le même AMP. Les lignes sont jointes en fonction de leur hachage de ligne. La jointure de fusion utilise différentes stratégies de jointure pour amener les lignes vers le même AMP.
Stratégie n ° 1
Si les colonnes de jointure sont les index principaux des tables correspondantes, les lignes de jointure se trouvent déjà sur le même AMP. Dans ce cas, aucune distribution n'est requise.
Considérez les tableaux des employés et des salaires suivants.
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);
Lorsque ces deux tables sont jointes sur la colonne EmployeeNo, aucune redistribution n'a lieu puisque EmployeeNo est l'index principal des deux tables qui sont jointes.
Stratégie n ° 2
Considérez les tableaux d'employés et de services suivants.
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 );
Si ces deux tables sont jointes sur la colonne DeparmentNo, les lignes doivent être redistribuées car DepartmentNo est un index primaire dans une table et un index non primaire dans une autre table. Dans ce scénario, joindre des lignes peut ne pas être sur le même AMP. Dans ce cas, Teradata peut redistribuer la table des employés sur la colonne DepartmentNo.
Stratégie n ° 3
Pour les tables Employé et Département ci-dessus, Teradata peut dupliquer la table Département sur toutes les SAP, si la taille de la table Département est petite.
Jointure imbriquée
La jointure imbriquée n'utilise pas tous les AMP. Pour que la jointure imbriquée ait lieu, l'une des conditions doit être l'égalité sur l'index primaire unique d'une table, puis la jonction de cette colonne à n'importe quel index de l'autre table.
Dans ce scénario, le système récupérera la ligne à l'aide de l'index principal unique d'une table et utilisera ce hachage de ligne pour récupérer les enregistrements correspondants à partir d'une autre table. La jointure imbriquée est la plus efficace de toutes les méthodes de jointure.
Rejoindre le produit
Product Join compare chaque ligne éligible d'une table avec chaque ligne éligible d'une autre table. La jonction de produit peut avoir lieu en raison de certains des facteurs suivants -
- Où la condition est manquante.
- La condition de jointure n'est pas basée sur une condition d'égalité.
- Les alias de table ne sont pas corrects.
- Conditions de jointure multiples.
L'index primaire partitionné (PPI) est un mécanisme d'indexation utile pour améliorer les performances de certaines requêtes. Lorsque des lignes sont insérées dans une table, elles sont stockées dans un AMP et classées par ordre de hachage des lignes. Lorsqu'une table est définie avec PPI, les lignes sont triées par leur numéro de partition. Dans chaque partition, ils sont classés par hachage de ligne. Les lignes sont affectées à une partition en fonction de l'expression de partition définie.
Avantages
Évitez l'analyse complète de la table pour certaines requêtes.
Évitez d'utiliser un index secondaire qui nécessite une structure physique supplémentaire et une maintenance d'E / S supplémentaire.
Accédez rapidement à un sous-ensemble d'une grande table.
Supprimez rapidement les anciennes données et ajoutez de nouvelles données.
Exemple
Considérez la table Orders suivante avec l'index principal sur OrderNo.
MagasinNon | N ° de commande | Date de commande | Total de la commande |
---|---|---|---|
101 | 7501 | 01/10/2015 | 900 |
101 | 7502 | 02/10/2015 | 1 200 |
102 | 7503 | 02/10/2015 | 3 000 |
102 | 7504 | 03/10/2015 | 2 454 |
101 | 7505 | 03/10/2015 | 1201 |
103 | 7506 | 04/10/2015 | 2 454 |
101 | 7507 | 05/10/2015 | 1201 |
101 | 7508 | 05/10/2015 | 1201 |
Supposons que les enregistrements sont répartis entre les AMP comme indiqué dans les tableaux suivants. Les enregistrements sont stockés dans des AMP, triés en fonction de leur hachage de ligne.
RowHash | N ° de commande | Date de commande |
---|---|---|
1 | 7505 | 03/10/2015 |
2 | 7504 | 03/10/2015 |
3 | 7501 | 01/10/2015 |
4 | 7508 | 05/10/2015 |
RowHash | N ° de commande | Date de commande |
---|---|---|
1 | 7507 | 05/10/2015 |
2 | 7502 | 02/10/2015 |
3 | 7506 | 04/10/2015 |
4 | 7503 | 02/10/2015 |
Si vous exécutez une requête pour extraire les commandes pour une date particulière, l'optimiseur peut choisir d'utiliser l'analyse complète de la table, puis tous les enregistrements de l'AMP sont accessibles. Pour éviter cela, vous pouvez définir la date de la commande en tant qu'index primaire partitionné. Lorsque des lignes sont insérées dans la table des commandes, elles sont partitionnées par date de commande. Dans chaque partition, ils seront classés par hachage de ligne.
Les données suivantes montrent comment les enregistrements seront stockés dans les AMP, s'ils sont partitionnés par date de commande. Si une requête est exécutée pour accéder aux enregistrements par date de commande, seule la partition qui contient les enregistrements pour cette commande particulière sera accessible.
Cloison | RowHash | N ° de commande | Date de commande |
---|---|---|---|
0 | 3 | 7501 | 01/10/2015 |
1 | 1 | 7505 | 03/10/2015 |
1 | 2 | 7504 | 03/10/2015 |
2 | 4 | 7508 | 05/10/2015 |
Cloison | RowHash | N ° de commande | Date de commande |
---|---|---|---|
0 | 2 | 7502 | 02/10/2015 |
0 | 4 | 7503 | 02/10/2015 |
1 | 3 | 7506 | 04/10/2015 |
2 | 1 | 7507 | 05/10/2015 |
Voici un exemple pour créer une table avec l'index principal de la partition. La clause PARTITION BY est utilisée pour définir la partition.
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
);
Dans l'exemple ci-dessus, la table est partitionnée par colonne OrderDate. Il y aura une partition distincte pour chaque jour.
Les fonctions OLAP sont similaires aux fonctions d'agrégation, sauf que les fonctions d'agrégation ne renverront qu'une seule valeur tandis que la fonction OLAP fournira les lignes individuelles en plus des agrégats.
Syntaxe
Voici la syntaxe générale de la fonction OLAP.
<aggregate function> OVER
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN
UNBOUDED PRECEDING AND UNBOUNDED FOLLOWING)
Les fonctions d'agrégation peuvent être SUM, COUNT, MAX, MIN, AVG.
Exemple
Considérez le tableau des salaires suivant.
Numéro d'employé | Brut | Déduction | Salaire net |
---|---|---|---|
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 |
Voici un exemple pour trouver la somme cumulée ou le total cumulé de NetPay sur la table des salaires. Les enregistrements sont triés par EmployeeNo et la somme cumulée est calculée sur la colonne NetPay.
SELECT
EmployeeNo, NetPay,
SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS
UNBOUNDED PRECEDING) as TotalSalary
FROM Salary;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
EmployeeNo NetPay TotalSalary
----------- ----------- -----------
101 36000 36000
102 74000 110000
103 83000 193000
104 70000 263000
105 18000 281000
RANG
La fonction RANK classe les enregistrements en fonction de la colonne fournie. La fonction RANK peut également filtrer le nombre d'enregistrements renvoyés en fonction du rang.
Syntaxe
Voici la syntaxe générique pour utiliser la fonction RANK.
RANK() OVER
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | JoinedDate | DépartementID | Date de naissance |
---|---|---|---|---|---|
101 | Mike | James | 27/03/2005 | 1 | 05/01/1980 |
102 | Robert | Williams | 25/04/2007 | 2 | 05/03/1983 |
103 | Peter | Paul | 21/03/2007 | 2 | 01/04/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 06/11/1984 |
105 | Robert | James | 1/4/2008 | 3 | 01/12/1984 |
La requête suivante classe les enregistrements de la table des employés par date de connexion et attribue le classement à la date de connexion.
SELECT EmployeeNo, JoinedDate,RANK()
OVER(ORDER BY JoinedDate) as Seniority
FROM Employee;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante.
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 clause PARTITION BY regroupe les données par les colonnes définies dans la clause PARTITION BY et exécute la fonction OLAP dans chaque groupe. Voici un exemple de la requête qui utilise la clause PARTITION BY.
SELECT EmployeeNo, JoinedDate,RANK()
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority
FROM Employee;
Lorsque la requête ci-dessus est exécutée, elle produit la sortie suivante. Vous pouvez voir que le rang est réinitialisé pour chaque département.
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
Ce chapitre décrit les fonctionnalités disponibles pour la protection des données dans Teradata.
Journal transitoire
Teradata utilise Transient Journal pour protéger les données contre les échecs de transaction. Chaque fois que des transactions sont exécutées, le journal des transitoires conserve une copie des images avant des lignes affectées jusqu'à ce que la transaction réussisse ou soit annulée avec succès. Ensuite, les images avant sont supprimées. Le journal des transitoires est conservé dans chaque AMP. Il s'agit d'un processus automatique et ne peut pas être désactivé.
Se retirer
Fallback protège les données de la table en stockant la deuxième copie des lignes d'une table sur un autre AMP appelé Fallback AMP. Si un AMP échoue, les lignes de secours sont accédées. Avec cela, même si un AMP échoue, les données sont toujours disponibles via AMP de secours. L'option de secours peut être utilisée lors de la création de la table ou après la création de la table. Le repli garantit que la deuxième copie des lignes de la table est toujours stockée dans un autre AMP pour protéger les données de l'échec AMP. Cependant, le secours occupe deux fois le stockage et les E / S pour l'insertion / la suppression / la mise à jour.
Le diagramme suivant montre comment la copie de secours des lignes est stockée dans un autre AMP.
Down AMP Recovery Journal
Le journal de récupération Down AMP est activé lorsque l'AMP échoue et que la table est protégée contre le repli. Ce journal garde une trace de toutes les modifications apportées aux données de l'AMP défaillant. Le journal est activé sur les AMP restants du cluster. Il s'agit d'un processus automatique et ne peut pas être désactivé. Une fois que l'AMP défaillant est actif, les données du journal de récupération Down AMP sont synchronisées avec l'AMP. Une fois que cela est fait, le journal est supprimé.
Cliques
Clique est un mécanisme utilisé par Teradata pour protéger les données des pannes de nœud. Une clique n'est rien d'autre qu'un ensemble de nœuds Teradata qui partagent un ensemble commun de baies de disques. Lorsqu'un nœud tombe en panne, les vprocs du nœud défaillant migrent vers d'autres nœuds de la clique et continuent d'accéder à leurs baies de disques.
Nœud de redondance d'UC
Le nœud de redondance d'UC est un nœud qui ne participe pas à l'environnement de production. Si un nœud échoue, les vprocs des nœuds défaillants migreront vers le nœud de secours. Une fois le nœud défaillant récupéré, il devient le nœud de secours. Les nœuds de redondance d'UC sont utilisés pour maintenir les performances en cas de défaillance des nœuds.
RAID
La matrice redondante de disques indépendants (RAID) est un mécanisme utilisé pour protéger les données contre les pannes de disque. La matrice de disques se compose d'un ensemble de disques regroupés sous la forme d'une unité logique. Cette unité peut ressembler à une seule unité pour l'utilisateur, mais elles peuvent être réparties sur plusieurs disques.
RAID 1 est couramment utilisé dans Teradata. En RAID 1, chaque disque est associé à un disque miroir. Toute modification des données du disque principal est également reflétée dans la copie miroir. Si le disque principal tombe en panne, les données du disque miroir sont alors accessibles.
Ce chapitre a abordé les différentes stratégies de gestion des utilisateurs dans Teradata.
Utilisateurs
Un utilisateur est créé à l'aide de la commande CREATE USER. Dans Teradata, un utilisateur est également similaire à une base de données. Ils peuvent tous deux se voir attribuer un espace et contenir des objets de base de données, sauf qu'un mot de passe est attribué à l'utilisateur.
Syntaxe
Voici la syntaxe de CREATE USER.
CREATE USER username
AS
[PERMANENT|PERM] = n BYTES
PASSWORD = password
TEMPORARY = n BYTES
SPOOL = n BYTES;
Lors de la création d'un utilisateur, les valeurs du nom d'utilisateur, de l'espace permanent et du mot de passe sont obligatoires. Les autres champs sont facultatifs.
Exemple
Voici un exemple pour créer l'utilisateur TD01.
CREATE USER TD01
AS
PERMANENT = 1000000 BYTES
PASSWORD = ABC$124
TEMPORARY = 1000000 BYTES
SPOOL = 1000000 BYTES;
Comptes
Lors de la création d'un nouvel utilisateur, l'utilisateur peut être affecté à un compte. L'option COMPTE dans CREATE USER est utilisée pour attribuer le compte. Un utilisateur peut être affecté à plusieurs comptes.
Syntaxe
Voici la syntaxe de CREATE USER avec l'option de compte.
CREATE USER username
PERM = n BYTES
PASSWORD = password
ACCOUNT = accountid
Exemple
L'exemple suivant crée l'utilisateur TD02 et affecte le compte en tant qu'informatique et administrateur.
CREATE USER TD02
AS
PERMANENT = 1000000 BYTES
PASSWORD = abc$123
TEMPORARY = 1000000 BYTES
SPOOL = 1000000 BYTES
ACCOUNT = (‘IT’,’Admin’);
L'utilisateur peut spécifier l'ID de compte lors de la connexion au système Teradata ou après avoir été connecté au système à l'aide de la commande SET SESSION.
.LOGON username, passowrd,accountid
OR
SET SESSION ACCOUNT = accountid
Accorder des privilèges
La commande GRANT est utilisée pour attribuer un ou plusieurs privilèges sur les objets de base de données à l'utilisateur ou à la base de données.
Syntaxe
Voici la syntaxe de la commande GRANT.
GRANT privileges ON objectname TO username;
Les privilèges peuvent être INSERT, SELECT, UPDATE, REFERENCES.
Exemple
Voici un exemple d'instruction GRANT.
GRANT SELECT,INSERT,UPDATE ON Employee TO TD01;
Révoquer les privilèges
La commande REVOKE supprime les privilèges des utilisateurs ou des bases de données. La commande REVOKE ne peut supprimer que les privilèges explicites.
Syntaxe
Voici la syntaxe de base de la commande REVOKE.
REVOKE [ALL|privileges] ON objectname FROM username;
Exemple
Voici un exemple de commande REVOKE.
REVOKE INSERT,SELECT ON Employee FROM TD01;
Ce chapitre décrit la procédure de réglage des performances dans Teradata.
Explique
La première étape du réglage des performances consiste à utiliser EXPLAIN sur votre requête. Le plan EXPLAIN donne les détails sur la manière dont l'optimiseur exécutera votre requête. Dans le plan Explain, vérifiez les mots-clés tels que le niveau de confiance, la stratégie de jointure utilisée, la taille du fichier de spoule, la redistribution, etc.
Collecter des statistiques
Optimizer utilise les données démographiques pour élaborer une stratégie d'exécution efficace. La commande COLLECT STATISTICS est utilisée pour collecter les données démographiques de la table. Assurez-vous que les statistiques collectées sur les colonnes sont à jour.
Collectez des statistiques sur les colonnes utilisées dans la clause WHERE et sur les colonnes utilisées dans la condition de jointure.
Collectez des statistiques sur les colonnes d'index primaire unique.
Collectez des statistiques sur les colonnes d'index secondaire non unique. L'optimiseur décidera s'il peut utiliser NUSI ou l'analyse complète de la table.
Collectez des statistiques sur l'index de jointure en collectant les statistiques sur la table de base.
Collectez des statistiques sur les colonnes de partitionnement.
Types de données
Assurez-vous que les types de données appropriés sont utilisés. Cela évitera l'utilisation d'un stockage excessif que nécessaire.
Conversion
Assurez-vous que les types de données des colonnes utilisées dans la condition de jointure sont compatibles pour éviter les conversions de données explicites.
Trier
Supprimez les clauses ORDER BY inutiles, sauf si nécessaire.
Problème d'espace de spool
Une erreur d'espace de spoule est générée si la requête dépasse la limite d'espace de spoule AMP pour cet utilisateur. Vérifiez le plan d’explication et identifiez l’étape qui consomme plus d’espace de spoule. Ces requêtes intermédiaires peuvent être divisées et placées séparément pour créer des tables temporaires.
Index primaire
Assurez-vous que l'index primaire est correctement défini pour la table. La colonne d'index primaire doit répartir uniformément les données et doit être fréquemment utilisée pour accéder aux données.
Table SET
Si vous définissez une table SET, l'optimiseur vérifiera si l'enregistrement est dupliqué pour chaque enregistrement inséré. Pour supprimer la condition de vérification en double, vous pouvez définir un index secondaire unique pour la table.
MISE À JOUR sur la grande table
La mise à jour de la grande table prendra du temps. Au lieu de mettre à jour la table, vous pouvez supprimer les enregistrements et insérer les enregistrements avec des lignes modifiées.
Suppression de tables temporaires
Supprimez les tables temporaires (tables intermédiaires) et volatiles si elles ne sont plus nécessaires. Cela libérera de l'espace permanent et de l'espace de bobine.
Table MULTISET
Si vous êtes sûr que les enregistrements d'entrée n'auront pas d'enregistrements en double, vous pouvez définir la table cible comme table MULTISET pour éviter la vérification de ligne en double utilisée par la table SET.
L'utilitaire FastLoad est utilisé pour charger des données dans des tables vides. Puisqu'il n'utilise pas de journaux temporaires, les données peuvent être chargées rapidement. Il ne charge pas les lignes dupliquées même si la table cible est une table MULTISET.
Limitation
La table cible ne doit pas avoir d'index secondaire, d'index de jointure et de référence de clé étrangère.
Fonctionnement de FastLoad
FastLoad est exécuté en deux phases.
La phase 1
Les moteurs d'analyse lisent les enregistrements du fichier d'entrée et envoient un bloc à chaque AMP.
Chaque AMP stocke les blocs d'enregistrements.
Ensuite, les AMP hachent chaque enregistrement et les redistribuent vers l'AMP approprié.
À la fin de la phase 1, chaque AMP a ses lignes mais elles ne sont pas dans la séquence de hachage des lignes.
Phase 2
La phase 2 démarre lorsque FastLoad reçoit l'instruction END LOADING.
Chaque AMP trie les enregistrements sur le hachage de ligne et les écrit sur le disque.
Les verrous sur la table cible sont libérés et les tables d'erreur sont supprimées.
Exemple
Créez un fichier texte avec les enregistrements suivants et nommez le fichier comme employee.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
Voici un exemple de script FastLoad pour charger le fichier ci-dessus dans la table 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;
Exécution d'un script FastLoad
Une fois le fichier d'entrée employee.txt créé et le script FastLoad nommé EmployeeLoad.fl, vous pouvez exécuter le script FastLoad à l'aide de la commande suivante sous UNIX et Windows.
FastLoad < EmployeeLoad.fl;
Une fois la commande ci-dessus exécutée, le script FastLoad s'exécutera et produira le journal. Dans le journal, vous pouvez voir le nombre d'enregistrements traités par FastLoad et le code d'état.
**** 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
Conditions de FastLoad
Voici la liste des termes courants utilisés dans le script FastLoad.
LOGON - Se connecte à Teradata et lance une ou plusieurs sessions.
DATABASE - Définit la base de données par défaut.
BEGIN LOADING - Identifie la table à charger.
ERRORFILES - Identifie les 2 tables d'erreurs qui doivent être créées / mises à jour.
CHECKPOINT - Définit quand prendre le point de contrôle.
SET RECORD - Spécifie si le format du fichier d'entrée est formaté, binaire, texte ou non formaté.
DEFINE - Définit la disposition du fichier d'entrée.
FILE - Spécifie le nom et le chemin du fichier d'entrée.
INSERT - Insère les enregistrements du fichier d'entrée dans la table cible.
END LOADING- Lance la phase 2 du FastLoad. Distribue les enregistrements dans la table cible.
LOGOFF - Met fin à toutes les sessions et met fin à FastLoad.
MultiLoad peut charger plusieurs tables à la fois et il peut également effectuer différents types de tâches telles que INSERT, DELETE, UPDATE et UPSERT. Il peut charger jusqu'à 5 tables à la fois et effectuer jusqu'à 20 opérations DML dans un script. La table cible n'est pas requise pour MultiLoad.
MultiLoad prend en charge deux modes -
- IMPORT
- DELETE
MultiLoad nécessite une table de travail, une table de journal et deux tables d'erreurs en plus de la table cible.
Log Table - Utilisé pour maintenir les points de contrôle pris pendant le chargement qui seront utilisés pour le redémarrage.
Error Tables- Ces tables sont insérées lors du chargement lorsqu'une erreur survient. La première table d'erreurs stocke les erreurs de conversion tandis que la seconde table d'erreurs stocke les enregistrements en double.
Log Table - Conserve les résultats de chaque phase de MultiLoad à des fins de redémarrage.
Work table- Le script MultiLoad crée une table de travail par table cible. La table de travail est utilisée pour conserver les tâches DML et les données d'entrée.
Limitation
MultiLoad a quelques limitations.
- Index secondaire unique non pris en charge sur la table cible.
- L'intégrité référentielle n'est pas prise en charge.
- Déclencheurs non pris en charge.
Comment fonctionne MultiLoad
L'importation MultiLoad comporte cinq phases -
Phase 1 - Phase préliminaire - Exécute les activités de configuration de base.
Phase 2 - Phase de transaction DML - Vérifie la syntaxe des instructions DML et les apporte au système Teradata.
Phase 3 - Phase d'acquisition - Apporte les données d'entrée dans les tables de travail et verrouille la table.
Phase 4 - Phase d'application - Applique toutes les opérations DML.
Phase 5 - Phase de nettoyage - Libère le verrouillage de la table.
Les étapes impliquées dans un script MultiLoad sont:
Step 1 - Configurez la table des journaux.
Step 2 - Connectez-vous à Teradata.
Step 3 - Spécifiez les tables Target, Work et Error.
Step 4 - Définissez la disposition du fichier INPUT.
Step 5 - Définissez les requêtes DML.
Step 6 - Nommez le fichier IMPORT.
Step 7 - Spécifiez la DISPOSITION à utiliser.
Step 8 - Lancez le chargement.
Step 9 - Terminez le chargement et terminez les sessions.
Exemple
Créez un fichier texte avec les enregistrements suivants et nommez le fichier comme employee.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'exemple suivant est un script MultiLoad qui lit les enregistrements de la table Employee et se charge dans la table 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;
Exécution d'un script MultiLoad
Une fois que le fichier d'entrée employee.txt est créé et que le script de chargement multiple est nommé EmployeeLoad.ml, vous pouvez exécuter le script de chargement multiple à l'aide de la commande suivante sous UNIX et Windows.
Multiload < EmployeeLoad.ml;
L'utilitaire FastExport est utilisé pour exporter les données des tables Teradata dans des fichiers plats. Il peut également générer les données au format rapport. Les données peuvent être extraites d'une ou plusieurs tables à l'aide de Join. Étant donné que FastExport exporte les données dans des blocs de 64 Ko, il est utile pour extraire un grand volume de données.
Exemple
Considérez le tableau des employés suivant.
Numéro d'employé | Prénom | Nom de famille | Date de naissance |
---|---|---|---|
101 | Mike | James | 05/01/1980 |
104 | Alex | Stuart | 06/11/1984 |
102 | Robert | Williams | 05/03/1983 |
105 | Robert | James | 01/12/1984 |
103 | Peter | Paul | 01/04/1983 |
Voici un exemple de script FastExport. Il exporte les données de la table des employés et écrit dans un fichier 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;
Exécution d'un script FastExport
Une fois le script écrit et nommé employé.fx, vous pouvez utiliser la commande suivante pour exécuter le script.
fexp < employee.fx
Après avoir exécuté la commande ci-dessus, vous recevrez la sortie suivante dans le fichier 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
Conditions de FastExport
Voici la liste des termes couramment utilisés dans le script FastExport.
LOGTABLE - Spécifie la table du journal à des fins de redémarrage.
LOGON - Se connecte à Teradata et lance une ou plusieurs sessions.
DATABASE - Définit la base de données par défaut.
BEGIN EXPORT - Indique le début de l'exportation.
EXPORT - Spécifie le fichier cible et le format d'exportation.
SELECT - Spécifie la requête de sélection pour exporter les données.
END EXPORT - Spécifie la fin de FastExport.
LOGOFF - Met fin à toutes les sessions et met fin à FastExport.
L'utilitaire BTEQ est un utilitaire puissant de Teradata qui peut être utilisé à la fois en mode batch et interactif. Il peut être utilisé pour exécuter n'importe quelle instruction DDL, instruction DML, créer des macros et des procédures stockées. BTEQ peut être utilisé pour importer des données dans des tables Teradata à partir d'un fichier plat et il peut également être utilisé pour extraire des données de tables dans des fichiers ou des rapports.
Termes BTEQ
Voici la liste des termes couramment utilisés dans les scripts BTEQ.
LOGON - Utilisé pour se connecter au système Teradata.
ACTIVITYCOUNT - Renvoie le nombre de lignes affectées par la requête précédente.
ERRORCODE - Renvoie le code d'état de la requête précédente.
DATABASE - Définit la base de données par défaut.
LABEL - Attribue une étiquette à un ensemble de commandes SQL.
RUN FILE - Exécute la requête contenue dans un fichier.
GOTO - Transfère le contrôle vers une étiquette.
LOGOFF - Se déconnecte de la base de données et met fin à toutes les sessions.
IMPORT - Spécifie le chemin du fichier d'entrée.
EXPORT - Spécifie le chemin du fichier de sortie et lance l'exportation.
Exemple
Voici un exemple de script BTEQ.
.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;
Le script ci-dessus effectue les tâches suivantes.
Se connecte au système Teradata.
Définit la base de données par défaut.
Crée une table appelée employee_bkup.
Sélectionne un enregistrement de la table Employee pour vérifier si la table contient des enregistrements.
Supprime la table employee_bkup, si la table est vide.
Transfère le contrôle vers un Label InsertEmployee qui insère des enregistrements dans la table employee_bkup
Vérifie ERRORCODE pour s'assurer que l'instruction est réussie, après chaque instruction SQL.
ACTIVITYCOUNT renvoie le nombre d'enregistrements sélectionnés / impactés par la requête SQL précédente.