Teradata-JOIN 인덱스
JOIN INDEX는 구체화 된 뷰입니다. 그 정의는 영구적으로 저장되고 조인 인덱스에서 참조되는 기본 테이블이 업데이트 될 때마다 데이터가 업데이트됩니다. JOIN INDEX는 하나 이상의 테이블을 포함 할 수 있으며 사전 집계 된 데이터도 포함 할 수 있습니다. 조인 인덱스는 주로 성능 향상에 사용됩니다.
다양한 유형의 조인 인덱스를 사용할 수 있습니다.
- 단일 테이블 조인 인덱스 (STJI)
- MTJI (Multi Table Join Index)
- 집계 조인 인덱스 (AJI)
단일 테이블 조인 인덱스
단일 테이블 조인 인덱스를 사용하면 기본 테이블의 것과 다른 기본 인덱스 열을 기반으로 큰 테이블을 분할 할 수 있습니다.
통사론
다음은 JOIN INDEX의 구문입니다.
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라는 Join 인덱스를 생성하는 예제입니다.
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라는 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가 업데이트 될 때마다 Join 인덱스 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);