codecamp

Teradata JOIN策略

本章讨论Teradata中可用的各种JOIN策略。

加入方法

Teradata使用不同的连接方法来执行连接操作。 一些常用的Join方法是 :
合并加入
嵌套连接
产品加盟
合并加入
当连接基于等式条件时,发生合并连接方法。 合并连接要求连接行在同一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

考虑以下Employee和Department表。

CREATE SET TABLE EMPLOYEE,FALLBACK (
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30) , 
   LastName VARCHAR(30) , 
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );
CREATE SET TABLE DEPARTMENT,FALLBACK ( 
   DepartmentNo BYTEINT, 
   DepartmentName CHAR(15) 
) 
UNIQUE PRIMARY INDEX ( DepartmentNo );

如果这两个表在DeparmentNo列上连接,那么这些行需要重新分布,因为DepartmentNo是一个表中的主索引和另一个表中的非主索引。 在这种情况下,加入行可能不在同一个AMP上。 在这种情况下,Teradata可能会在DepartmentNo列重新分发employee表。

策略#3

对于上述Employee和Department表,如果Department表的大小较小,Teradata可能会复制所有AMP上的Department表。

嵌套连接

嵌套连接不使用所有AMP。 对于嵌套连接发生,其中一个条件应该是一个表的唯一主索引上的相等,然后将此列连接到另一个表上的任何索引。

在这种情况下,系统将使用一个表的唯一主索引获取一行,并使用该行哈希从其他表获取匹配的记录。 嵌套连接是所有Join方法中最有效的。

产品加盟

Product Join将来自一个表的每个限定行与来自其他表的每个限定行进行比较。 产品加入可能由于以下某些因素而发生:

  • 缺少条件。
  • 连接条件不基于等式条件。
  • 表别名不正确。
  • 多连接条件。
Teradata 存储过程
Teradata 分区主索引
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }