- Teradata 教程
- Teradata - 首頁
- Teradata 基礎
- Teradata - 簡介
- Teradata - 安裝
- Teradata - 架構
- Teradata - 關係型概念
- Teradata - 資料型別
- Teradata - 表
- Teradata - 資料操作
- Teradata - SELECT 語句
- 邏輯與條件運算子
- Teradata - SET 運算子
- Teradata - 字串操作
- Teradata - 日期/時間函式
- Teradata - 內建函式
- Teradata - 聚合函式
- Teradata - CASE 與 COALESCE
- Teradata - 主索引
- Teradata - 連線
- Teradata - 子查詢
- Teradata 高階
- Teradata - 表型別
- Teradata - 空間概念
- Teradata - 二級索引
- Teradata - 統計資訊
- Teradata - 壓縮
- Teradata - EXPLAIN
- Teradata - 雜湊演算法
- Teradata - 連線索引
- Teradata - 檢視
- Teradata - 宏
- Teradata - 儲存過程
- Teradata - 連線策略
- Teradata - 分割槽主索引
- Teradata - OLAP 函式
- Teradata - 資料保護
- Teradata - 使用者管理
- Teradata - 效能調優
- Teradata - FastLoad
- Teradata - MultiLoad
- Teradata - FastExport
- Teradata - BTEQ
- Teradata 有用資源
- Teradata - 問答
- Teradata - 快速指南
- Teradata - 有用資源
- Teradata - 討論
Teradata - 連線索引
連線索引是一種物化檢視。其定義被永久儲存,並且每當連線索引中引用的基表更新時,資料也會更新。連線索引可能包含一個或多個表,也可能包含預聚合資料。連線索引主要用於提高效能。
有不同型別的連線索引可用。
- 單表連線索引 (STJI)
- 多表連線索引 (MTJI)
- 聚合連線索引 (AJI)
單表連線索引
單表連線索引允許基於與基表不同的主鍵列對大型表進行分割槽。
語法
以下是連線索引的語法。
CREATE JOIN INDEX <index name> AS <SELECT Query> <Index Definition>;
示例
考慮以下 Employee 和 Salary 表。
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 列進行查詢時,最佳化器正在使用連線索引而不是基表 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 的連線索引。
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 計劃可用於驗證最佳化器是否會選擇基表或連線索引。
聚合連線索引
如果某個表始終在某些列上進行聚合,則可以在該表上定義聚合連線索引以提高效能。聚合連線索引的一個限制是它僅支援 SUM 和 COUNT 函式。
示例
在以下示例中,Employee 和 Salary 連線以識別每個部門的總薪資。
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);