Teradata-분할 된 기본 인덱스
PPI (Partitioned Primary Index)는 특정 쿼리의 성능을 향상시키는 데 유용한 인덱싱 메커니즘입니다. 행이 테이블에 삽입되면 AMP에 저장되고 행 해시 순서에 따라 정렬됩니다. 테이블이 PPI로 정의되면 행이 파티션 번호별로 정렬됩니다. 각 파티션 내에서 행 해시로 정렬됩니다. 정의 된 파티션 표현식을 기반으로 행이 파티션에 할당됩니다.
장점
특정 쿼리에 대한 전체 테이블 스캔을 피하십시오.
추가 물리적 구조와 추가 I / O 유지 관리가 필요한 보조 인덱스는 사용하지 마십시오.
큰 테이블의 하위 집합에 빠르게 액세스합니다.
이전 데이터를 빠르게 삭제하고 새 데이터를 추가하십시오.
예
OrderNo에 대한 기본 인덱스가있는 다음 주문 테이블을 고려하십시오.
StoreNo | 주문 번호 | OrderDate | OrderTotal |
---|---|---|---|
101 | 7501 | 2015-10-01 | 900 |
101 | 7502 | 2015-10-02 | 1,200 |
102 | 7503 | 2015-10-02 | 3,000 |
102 | 7504 | 2015-10-03 | 2,454 |
101 | 7505 | 2015-10-03 | 1201 |
103 | 7506 | 2015-10-04 | 2,454 |
101 | 7507 | 2015-10-05 | 1201 |
101 | 7508 | 2015-10-05 | 1201 |
다음 표에 표시된 것처럼 레코드가 AMP간에 배포된다고 가정합니다. 기록은 AMP에 저장되며 행 해시를 기준으로 정렬됩니다.
RowHash | 주문 번호 | OrderDate |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
삼 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | 주문 번호 | OrderDate |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
삼 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
특정 날짜에 대한 주문을 추출하기 위해 쿼리를 실행하면 최적화 프로그램이 전체 테이블 스캔을 사용하도록 선택할 수 있으며 AMP 내의 모든 레코드에 액세스 할 수 있습니다. 이를 방지하기 위해 주문 날짜를 분할 된 기본 인덱스로 정의 할 수 있습니다. 주문 테이블에 행이 삽입되면 주문 날짜별로 분할됩니다. 각 파티션 내에서 행 해시로 정렬됩니다.
다음 데이터는 레코드가 Order Date로 분할 된 경우 AMP에 레코드가 저장되는 방식을 보여줍니다. Order Date별로 레코드에 액세스하기 위해 쿼리를 실행하면 해당 특정 주문에 대한 레코드가 포함 된 파티션 만 액세스됩니다.
분할 | RowHash | 주문 번호 | OrderDate |
---|---|---|---|
0 | 삼 | 7501 | 2015-10-01 |
1 | 1 | 7505 | 2015-10-03 |
1 | 2 | 7504 | 2015-10-03 |
2 | 4 | 7508 | 2015-10-05 |
분할 | RowHash | 주문 번호 | OrderDate |
---|---|---|---|
0 | 2 | 7502 | 2015-10-02 |
0 | 4 | 7503 | 2015-10-02 |
1 | 삼 | 7506 | 2015-10-04 |
2 | 1 | 7507 | 2015-10-05 |
다음은 파티션 primary Index가있는 테이블을 생성하는 예입니다. PARTITION BY 절은 파티션을 정의하는 데 사용됩니다.
CREATE SET TABLE Orders (
StoreNo SMALLINT,
OrderNo INTEGER,
OrderDate DATE FORMAT 'YYYY-MM-DD',
OrderTotal INTEGER
)
PRIMARY INDEX(OrderNo)
PARTITION BY RANGE_N (
OrderDate BETWEEN DATE '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY
);
위의 예에서 테이블은 OrderDate 열로 분할됩니다. 매일 하나의 별도 파티션이 있습니다.