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);