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