Teradata - JOIN 策略
本章讨论了 Teradata 中可用的各种 JOIN 策略。
连接方法
Teradata 使用不同的连接方法执行连接操作。一些常用的连接方法是 −
- 合并连接
- 嵌套连接
- 产品连接
合并连接
当连接基于相等条件时,会使用合并连接方法。合并连接要求连接的行位于同一 AMP 上。行根据其行哈希进行连接。合并连接使用不同的连接策略将行带到同一 AMP。
策略 #1
如果连接列是相应表的主索引,则连接的行已位于同一 AMP 上。在这种情况下,不需要分配。
考虑以下员工和工资表。
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);
当这两个表在 EmployeeNo 列上连接时,不会发生重新分配,因为 EmployeeNo 是被连接的两个表的主索引。
策略 #2
考虑以下员工和部门表。
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 );
如果这两个表在 DeparmentNo 列上连接,则需要重新分配行,因为 DepartmentNo 是一个表中的主索引,而另一个表中的非主索引。在这种情况下,连接的行可能不在同一 AMP 上。在这种情况下,Teradata 可能会在 DepartmentNo 列上重新分配员工表。
策略 #3
对于上述员工和部门表,如果部门表的大小较小,Teradata 可能会在所有 AMP 上复制部门表。
嵌套连接
嵌套连接不使用所有 AMP。要使嵌套连接发生,条件之一应该是表的唯一主索引相等,然后将此列连接到另一个表上的任何索引。
在这种情况下,系统将使用一个表的唯一主索引获取一行,并使用该行哈希从其他表中获取匹配的记录。嵌套连接是所有连接方法中最有效的。
产品连接
产品连接将一个表中的每个合格行与另一个表中的每个合格行进行比较。产品连接可能由于以下某些因素而发生 −
- 缺少 Where 条件。
- 连接条件不是基于相等条件。
- 表别名不正确。
- 多个连接条件。