Teradata JOIN索引
JOIN INDEX是一个物化视图。 其定义是永久存储的,并且只要更新连接索引中引用的基表,就会更新数据。 JOIN INDEX可以包含一个或多个表,并且还包含预聚合数据。 连接索引主要用于提高性能。
有不同类型的连接索引可用。
单表连接索引(STJI)
多表连接索引(MTJI)
聚合连接索引(AJI)
单表连接索引
单表联接索引允许基于不同于基表中的主索引列的主索引列来分区大表。
语法
以下是JOIN INDEX的语法。CREATE JOIN INDEX <index name> AS <SELECT Query> <Index Definition>;
例子
考虑以下员工和薪资表。
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);
以下是在Employee表上创建名为Employee_JI的联接索引的示例。
CREATE JOIN INDEX Employee_JI AS SELECT EmployeeNo,FirstName,LastName, BirthDate,JoinedDate,DepartmentNo FROM Employee PRIMARY INDEX(FirstName);
如果用户在EmployeeNo上提交带有WHERE子句的查询,那么系统将使用唯一的主索引查询Employee表。 如果用户使用employee_name查询employee表,则系统可以使用employee_name访问连接索引Employee_JI。 连接索引的行在employee_name列上进行散列。 如果未定义连接索引且employee_name未定义为辅助索引,则系统将执行全表扫描以访问耗时的行。
您可以运行以下EXPLAIN计划并验证优化程序计划。 在以下示例中,您可以看到,当表使用Employee_Name列查询时,优化程序正在使用Join Index而不是base Employee表。
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.
多表连接索引
通过连接多个表来创建多表连接索引。 多表连接索引可用于存储结果集的频繁连接的表以提高性能。
例子
以下示例通过连接Employee和Salary表来创建一个名为Employee_Salary_JI的JOIN INDEX。
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);
每当更新基表Employee或Salary时,连接索引Employee_Salary_JI也会自动更新。 如果您正在运行连接Employee和Salary表的查询,则优化程序可以选择直接从Employee_Salary_JI访问数据,而不是连接表。 EXPLAIN计划对查询可以用来验证优化器是否会选择基表或Join索引。
聚合联接索引
如果表在某些列上始终聚合,则可以在表上定义聚合连接索引以提高性能。 聚合连接索引的一个限制是它仅支持SUM和COUNT函数。
例子
在以下示例中,加入员工和工资以确定每个部门的总工资。
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);