Teradata - Index JOIN

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);