Oracle 12c에 Attribute Clustering 기능이 추가되었습니다. 이 기능을 사용하면 Direct Path Loads 또는 테이블 재구성 시 데이터를 정렬하여 CF를 높일 수 있습니다.
CLUSTERING [clustering_join] BY [ LINEAR | INTERLEAVED ] ORDER clustering_columns [{ YES | NO } ON LOAD] [{ YES | NO } ON DATA MOVEMENT] [zonemap_clause]
테스트를 위해 아래와 같이 t1, t2, t3 테이블을 생성하겠습니다. t2 테이블은 기본 설정으로 Attribute Clustering를 생성하고, t3 테이블은 ON LOAD 속성을 NO로 설정합니니다.
-- 1-1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; DROP TABLE t3 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR(100)); CREATE TABLE t2 (c1 NUMBER, c2 VARCHAR(100)) CLUSTERING BY LINEAR ORDER (c1); CREATE TABLE t3 (c1 NUMBER, c2 VARCHAR(100)) CLUSTERING BY LINEAR ORDER (c1) NO ON LOAD YES ON DATA MOVEMENT; CREATE INDEX t1_x1 ON t1 (c1); -- 1-2 ALTER SESSION SET "_optimizer_gather_stats_on_load" = FALSE;
아래 쿼리로 Attribute Clustering 관련 정보를 조회할 수 있습니다.
-- 2-1 SELECT table_name, clustering FROM user_tables WHERE table_name IN ('T1', 'T2', 'T3'); TABLE_NAME CLUSTERING ---------- ---------- T1 NO T2 YES T3 YES 3 행이 선택되었습니다. -- 2-2 SELECT table_name, clustering_type, on_load, on_datamovement FROM user_clustering_tables; TABLE_NAME CLUSTERING_TYPE ON_LOAD ON_DATAMOVEMENT ---------- --------------- ------- --------------- T2 LINEAR YES YES T3 LINEAR NO YES 2 행이 선택되었습니다. -- 2-3 SELECT table_name, detail_owner, detail_name, detail_column, position FROM user_clustering_keys; TABLE_NAME DETAIL_OWNER DETAIL_NAME DETAIL_COLUMN POSITION ---------- ------------ ----------- ------------- -------- T2 TUNA T2 C1 1 T3 TUNA T3 C1 1 2 행이 선택되었습니다. -- 2-4 SELECT * FROM user_clustering_dimensions; 선택된 레코드가 없습니다. -- 2-5 SELECT * FROM user_clustering_joins; 선택된 레코드가 없습니다.
Attribute Clustering는 아래 힌트와 관련이 있습니다.
-- 3 SELECT name, inverse, target_level, version FROM v$sql_hint WHERE name LIKE 'CLUSTERING'; NAME INVERSE TARGET_LEVEL VERSION ---------- ------------- ------------ -------- CLUSTERING NO_CLUSTERING 1 12.1.0.1 1개의 행이 선택되었습니다.
아래는 t2 테이블에 대한 INSERT 문의 실행 계획입니다. APPEND 힌트를 작성한 4-2번 INSERT 문의 실행 계획 2번에 SORT ORDER BY 오퍼레이션이 표시됩니다.
-- 4-1 INSERT INTO t2 SELECT * FROM t1; ----------------------------------------- | Id | Operation | Name | ----------------------------------------- | 0 | INSERT STATEMENT | | | 1 | LOAD TABLE CONVENTIONAL | T2 | | 2 | TABLE ACCESS FULL | T1 | ----------------------------------------- -- 4-2 INSERT /*+ APPEND */ INTO t2 SELECT * FROM t1; ------------------------------------ | Id | Operation | Name | ------------------------------------ | 0 | INSERT STATEMENT | | | 1 | LOAD AS SELECT | T2 | | 2 | SORT ORDER BY | | -- ! | 3 | TABLE ACCESS FULL| T1 | ------------------------------------ -- 4-3 INSERT /*+ APPEND NO_CLUSTERING */ INTO t2 SELECT * FROM t1; ----------------------------------- | Id | Operation | Name | ----------------------------------- | 0 | INSERT STATEMENT | | | 1 | LOAD AS SELECT | T2 | | 2 | TABLE ACCESS FULL| T1 | -----------------------------------
아래는 t3 테이블에 대한 INSERT 문의 실행 계획입니다. APPEND 힌트와 CLUSTERING 힌트를 작성한 5-3번 INSERT 문의 실행 계획 2번에 SORT ORDER BY 오퍼레이션이 표시됩니다.
-- 5-1 INSERT INTO t3 SELECT * FROM t1; ----------------------------------------- | Id | Operation | Name | ----------------------------------------- | 0 | INSERT STATEMENT | | | 1 | LOAD TABLE CONVENTIONAL | T3 | | 2 | TABLE ACCESS FULL | T1 | ----------------------------------------- -- 5-2 INSERT /*+ APPEND */ INTO t3 SELECT * FROM t1; ----------------------------------- | Id | Operation | Name | ----------------------------------- | 0 | INSERT STATEMENT | | | 1 | LOAD AS SELECT | T3 | | 2 | TABLE ACCESS FULL| T1 | ----------------------------------- -- 5-3 INSERT /*+ APPEND CLUSTERING */ INTO t3 SELECT * FROM t1; ------------------------------------ | Id | Operation | Name | ------------------------------------ | 0 | INSERT STATEMENT | | | 1 | LOAD AS SELECT | T3 | | 2 | SORT ORDER BY | | | 3 | TABLE ACCESS FULL| T1 | ------------------------------------
아래 6-1번 ALTER TABLE 문으로 테이블을 온라인으로 재구성할 수 있습니다.
-- 6-1 ALTER TABLE t1 ADD CLUSTERING BY LINEAR ORDER (c1); ALTER TABLE t1 MOVE ONLINE; ALTER TABLE t1 DROP CLUSTERING; -- 6-2 SELECT status FROM user_indexes WHERE index_name = 'T1_X1'; STATUS ------ VALID 1개의 행이 선택되었습니다.
관련 링크
- Data Warehousing Guide - Attribute Clustering
- Oracle Blog - Optimizing Queries with Attribute Clustering
- Oracle Blog - Optimizing Table Scans with Zone Maps
- ORACLE-BASE - Attribute Clustering in Oracle Database 12c Release 1