반응형
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 |
댓글