반응형
Oracle Partition Table Index 구성 기준 및 SQL 실행계획
Oracle Partition Table 기본구성 참고 |
#기존 인덱스 | ||||||
INDEX_OWNER | INDEX_NAME | INDEX_TYPE | UNIQUENESS | STATUS | PARTITIONED | COLUMN_LIST |
PCW | IX_ORDERS_PT_01 | NORMAL | NONUNIQUE | N/A | YES | EMPLOYEE_ID + ORDER_DATE |
PCW | IX_ORDERS_PT_02 | NORMAL | NONUNIQUE | N/A | YES | CUSTOMER_ID + ORDER_DATE |
PCW | IX_ORDERS_PT_03 | NORMAL | NONUNIQUE | VALID | NO | CUSTOMER_ID + ORDER_DATE + ORDER_TOTAL |
PCW | PX_ORDERS_PT | NORMAL | UNIQUE | N/A | YES | ORDER_ID + ORDER_DATE |
SQL 예제
SELECT /*+ gather_plan_statistics */ * FROM PCW.ORDERS_PT
WHERE ORDER_MODE ='test_:'
AND CUSTOMER_ID ='test_G'
AND EMPLOYEE_ID ='test_Z';
select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST'));
실행계획 확인
SQL_ID ack11hkdffmyq, child number 0
-------------------------------------
SELECT /*+ gather_plan_statistics */ * FROM PCW.ORDERS_PT WHERE
ORDER_MODE ='test_:' AND CUSTOMER_ID ='test_G' AND EMPLOYEE_ID
='test_Z'
Plan hash value: 4104968381
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 1858 (100)| | | | 16 |00:00:00.01 | 2289 | | | |
| 1 | PARTITION RANGE ALL | | 1 | 1 | 69 | 1858 (1)| 00:00:01 | 1 | 12 | 16 |00:00:00.01 | 2289 | | | |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| ORDERS_PT | 12 | 1 | 69 | 1858 (1)| 00:00:01 | 1 | 12 | 16 |00:00:00.06 | 2289 | | | |
| 3 | BITMAP CONVERSION TO ROWIDS | | 12 | | | | | | | 1634 |00:00:00.05 | 850 | | | |
| 4 | BITMAP AND | | 12 | | | | | | | 11 |00:00:00.05 | 850 | | | |
| 5 | BITMAP CONVERSION FROM ROWIDS | | 12 | | | | | | | 12 |00:00:00.03 | 406 | | | |
| 6 | SORT ORDER BY | | 12 | | | | | | | 42167 |00:00:00.02 | 406 | 4468K| 890K| 330K (0)|
|* 7 | INDEX RANGE SCAN | IX_ORDERS_PT_01 | 12 | 47391 | | 471 (0)| 00:00:01 | 1 | 12 | 42167 |00:00:00.01 | 406 | | | |
| 8 | BITMAP CONVERSION FROM ROWIDS | | 12 | | | | | | | 12 |00:00:00.03 | 444 | | | |
| 9 | SORT ORDER BY | | 12 | | | | | | | 42399 |00:00:00.03 | 444 | 4887K| 921K| 361K (0)|
|* 10 | INDEX RANGE SCAN | IX_ORDERS_PT_02 | 12 | 47391 | | 478 (0)| 00:00:01 | 1 | 12 | 42399 |00:00:00.01 | 444 | | | |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ORDER_MODE"='test_:')
7 - access("EMPLOYEE_ID"='test_Z')
filter("EMPLOYEE_ID"='test_Z')
10 - access("CUSTOMER_ID"='test_G')
filter("CUSTOMER_ID"='test_G')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
#SQL 분포도 조회 |
SELECT SUM(COUNT(*)) AS "총ROW카운트" , COUNT(*) AS "칼럼 중복 데이터" , ROUND(COUNT(*)/SUM(COUNT(*))*100,2) || '%' AS "분포도" FROM PCW.ORDERS_PT GROUP BY ORDER_MODE,CUSTOMER_ID ,EMPLOYEE_ID --PK컬럼 제외 ORDER BY 1 DESC; |
--SQL 조건 칼럼 인덱스 선정기준 10% 미만 --결과 5% |
SELECT SUM(COUNT(*)) AS "총ROW카운트" , COUNT(*) AS "ORDER_MODE 칼럼 중복 데이터" , ROUND(COUNT(*)/SUM(COUNT(*))*100,5) || '%' AS "분포도" FROM PCW.ORDERS_PT GROUP BY ORDER_MODE --PK컬럼 제외 UNION ALL SELECT SUM(COUNT(*)) AS "총ROW카운트" , COUNT(*) AS "CUSTOMER_ID 칼럼 중복 데이터" , ROUND(COUNT(*)/SUM(COUNT(*))*100,5) || '%' AS "분포도" FROM PCW.ORDERS_PT GROUP BY CUSTOMER_ID --PK컬럼 제외 UNION ALL SELECT SUM(COUNT(*)) AS "총ROW카운트" , COUNT(*) AS "EMPLOYEE_ID 칼럼 중복 데이터" , ROUND(COUNT(*)/SUM(COUNT(*))*100,5) || '%' AS "분포도" FROM PCW.ORDERS_PT GROUP BY EMPLOYEE_ID --PK컬럼 제외 ORDER BY 1 DESC; |
#SQL 조건 칼럼 분포도 | |||
ORDER_MODE | 1100603 | 95 | .00863% |
CUSTOMER_ID | 1100603 | 26 | .00236% |
EMPLOYEE_ID | 1100603 | 26 | .00236% |
#결합 인덱스 생성 | |
1번째 , 2번째 컬럼 CUSTOMER_ID,EMPLOYEE_ID .00236% 3번째 컬럼 ORDER_MODE .00863% 인덱스 포지션 순서 결정 | |
CREATE INDEX PCW.IX_ORDERS_PT_04 ON PCW.ORDERS_PT (CUSTOMER_ID,EMPLOYEE_ID,ORDER_MODE) TABLESPACE TEST LOCAL; -- LOCAL 인덱스 생성 ALTER INDEX PCW.IX_ORDERS_PT_04 INVISIBLE; -- 인덱스 생성시 옵티마이저 성능 이슈가 존재하여 생성후 바로 INVISIBLE 합니다. -- 힌트 /*+ NO_use_invisible_indexes */ -- 힌트 /*+ use_invisible_indexes */ |
#예제 SQL |
SELECT /*+ gather_plan_statistics use_invisible_indexes(IX_ORDERS_PT_04) */ * FROM PCW.ORDERS_PT -- INVISIBLE PCW.IX_ORDERS_PT_04 인덱스 사용 WHERE ORDER_MODE ='test_:' AND CUSTOMER_ID ='test_G' AND EMPLOYEE_ID ='test_Z'; select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST')); |
#실행계획 확인 |
SQL_ID am237haxxb01s, child number 0 ------------------------------------- SELECT /*+ gather_plan_statistics use_invisible_indexes(IX_ORDERS_PT_04) */ * FROM PCW.ORDERS_PT WHERE ORDER_MODE ='test_:' AND CUSTOMER_ID ='test_G' AND EMPLOYEE_ID ='test_Z' Plan hash value: 2565839650 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | Pstart| Pstop | A-Rows | A-Time | Buffers | Reads | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 26 (100)| | | | 16 |00:00:00.80 | 51 | 22 | | 1 | PARTITION RANGE ALL | | 1 | 1 | 69 | 26 (0)| 00:00:01 | 1 | 12 | 16 |00:00:00.80 | 51 | 22 | | 2 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| ORDERS_PT | 12 | 1 | 69 | 26 (0)| 00:00:01 | 1 | 12 | 16 |00:00:01.04 | 51 | 22 | |* 3 | INDEX RANGE SCAN | IX_ORDERS_PT_04 | 12 | 1 | | 25 (0)| 00:00:01 | 1 | 12 | 16 |00:00:01.04 | 35 | 22 | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("CUSTOMER_ID"='test_G' AND "EMPLOYEE_ID"='test_Z' AND "ORDER_MODE"='test_:') Hint Report (identified by operation id / Query Block Name / Object Alias): Total hints for statement: 1 (E - Syntax error (1)) --------------------------------------------------------------------------- 1 - SEL$1 E - IX_ORDERS_PT_04 Note ----- - dynamic statistics used: dynamic sampling (level=2) |
결과 : SQL 실행계획 확인 BUFFER 사용 감소 및 인덱스 IX_ORDERS_PT_04 사용으로 인한 수행속도 감소확인 |
반응형
'Oracle > Oracle Admin' 카테고리의 다른 글
Oracle Partition TABLE 기본 구성 (0) | 2022.02.16 |
---|---|
Oracle Controlfile 재 생성 오라클 구성 변경 (0) | 2021.12.20 |
Oracle Partition Table SPLIT (파티션 스플릿) (0) | 2021.12.17 |
Oracle Partition Table Shrink 및 Lock 확인 테스트 (0) | 2021.12.09 |
Oracle Partition Table Fragmentation(단편화 비교) (0) | 2021.11.22 |
댓글