📅  最后修改于: 2021-01-11 11:34:30             🧑  作者: Mango
Teradata连接索引存储预连接的表。连接索引与物化视图相当。
连接索引旨在允许通过访问索引而不是访问并可能连接其基础基表来解决查询。
连接索引包含一个或多个表,并且还提供了预先汇总的数据。连接索引主要用于提高性能。
连接索引是一个索引结构。必须将它们更多地视为具有行级分区,主索引和辅助索引的预聚合,预联接或永久表的添加层。
即使联接索引不能完全覆盖查询,优化器也可以使用它来联接其基础基表,该方法提供了比对基表中的请求中指定的所有列进行扫描更好的查询优化。
连接索引对于汇总基数大的表中的列的查询很有用。这些索引充当预联接表和摘要表的角色,而不会反规范数据库的逻辑设计。实际上,同时,非规范化通常可以提高一个或多个特定查询的性能。
Teradata中提供三种类型的联接索引。
这是联接索引的一些基本规则,例如:
单表联接索引仅从一个基本表创建。它们的目的是使同一个表具有不同的主索引,分区或较小的表(联接索引表),并且要假脱机的列较少。
由于不需要分发或复制,因此可以提高联接的性能。用户将查询基表,但是PE将决定是访问基表还是访问单表联接索引。
句法
以下是JOIN INDEX的语法。
CREATE JOIN INDEX
AS
例
考虑以下雇员和薪水表。
CREATE SET TABLE EMPLOYEE, FALLBACK
(
Employee_Id INTEGER,
First_Name VARCHAR(10),
Last_Name VARCHAR(10),
DOB DATE FORMAT 'YYYY-MM-DD',
DepartmentNo BYTEINT
)
UNIQUE PRIMARY INDEX (Employee_Id);
CREATE SET TABLE SALARY, FALLBACK
(
Employee_Id INTEGER,
Gross INTEGER,
Deduction INTEGER,
NetPay INTEGER
)
PRIMARY INDEX (Employee_Id)
UNIQUE INDEX (Employee_Id);
以下是在Employee表上创建名为Employee_JI的Join索引的示例。
CREATE JOIN INDEX Employee_JI
AS
SELECT Employee_Id, First_Name, Last_Name,
BirthDate, DepartmentNo
FROM Employee
PRIMARY INDEX (First_Name);
如果用户使用Employee_Id上的WHERE子句提交查询,则系统将使用唯一的主索引查询Employee表。
如果用户使用employee_name查询employee表,则系统可以使用employee_name访问联接索引Employee_JI。
连接索引的行散列在employee_name列上。如果未将联接索引和employee_name定义为辅助索引,则系统将执行全表扫描以访问行,这非常耗时。
我们可以运行以下EXPLAIN计划并验证优化程序计划。在以下示例中,当表使用Employee_Name列查询时,优化器将使用Join Index而不是基本Employee表。
EXPLAIN SELECT * FROM EMPLOYEE WHERE First_Name='Alexa';
/* Help information returned. 8 rows.
/* Total elapsed time was 1 second.
说明
1. First, we do a single-AMP RETRIEVE operation from EMPLOYEE_JI by using the primary index "EMPLOYEE_JI.First_Name = 'Alexa' with no residual conditions into Spool 1 (one-amp) 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.01 seconds.
//The contents of Spool 1 are sent back to the user as the result of statement 1. //The total estimated time is 0.01 seconds.
通过联接多个表来创建多表联接索引。多表联接索引可用于存储频繁联接表的结果集,以提高性能。
多表联接索引用于保存两列或更多列的预联接结果集。因此,在联接处理期间,PE可能决定从多表联接索引中访问数据,而不是再次联接基础表。我们需要记住,在基于连接的频率和成本进行大量分析之后,我们应该定义一个多表连接索引。
多表联接索引使我们可以将资源密集型联接从联机移动到批处理窗口。
转移工作负载并不能减少总的工作负载,但是它可以将其转变为有利于系统整体性能的时间点。
例
下面的示例通过联接Employee和Salary表来创建名为Employee_Salary_JI的JOIN INDEX。
CREATE JOIN INDEX Employee_Salary_JI
AS
SELECT a.Employee_Id,a.First_Name,a.Last_Name,
a.BirthDate,a.DepartmentNo,b.Gross,b.Deduction,b.NetPay
FROM Employee a
INNER JOIN Salary b
ON(a.Employee_Id = b.Employee_Id)
PRIMARY INDEX(First_Name);
当更新基本表Employee或Salary时,联接索引Employee_Salary_JI也将自动更新。
如果我们正在运行连接Employee和Salary表的查询,那么优化器可能选择直接从Employee_Salary_JI访问数据,而不是联接表。查询中的EXPLAIN计划可用于验证优化器是否选择基表或Join索引。
聚合联接索引方法用于解析经常在同一列或多个列上指定相同聚合操作的查询。
当聚合联接索引可用时,则系统不会为每个查询重复进行聚合计算。可以在两个或多个表或单个表上定义聚合联接索引。
如果表始终在特定列上聚合,则可以在表上定义聚合联接索引以提高性能。聚合联接索引的限制之一是它仅支持以下功能。
例
在下面的示例中,将“雇员”和“薪水”结合起来以标识每个部门的总薪水。
CREATE JOIN INDEX Employee_Salary_JI
AS
SELECT a.Department_Id,SUM(b.NetPay) AS TotalPay
FROM Employee a
INNER JOIN Salary b
ON(a.Employee_Id = b.Employee_Id)
GROUP BY a.DepartmentNo
Primary Index(DepartmentNo);