SELECT A.ORDER_ID,
A.ORDER_DATE,
A.ORDER_MODE ,
C.FIRST_NAME EMPNAME,
D.CUST_FIRST_NAME ,
B.PRODUCT_ID,
B.UNIT_PRICE,
B.QUANTITY
FROM ORDERS A,
ORDER_ITEMS B,
EMPLOYEES C,
CUSTOMERS D
WHERE A.ORDER_ID = B.ORDER_ID
AND A.EMPLOYEE_ID = C.EMPLOYEE_ID
AND A.CUSTOMER_ID = D.CUSTOMER_ID
AND A.ORDER_DATE >= TO_DATE('20120101', 'YYYYMMDD')
AND A.ORDER_DATE < TO_DATE('20120102', 'YYYYMMDD') ;
alter session set statistics_level=all;
select * from table(dbms_xplan.display_cursor(null, null, 'allstats last'));
select * from table(dbms_xplan.display_cursor(null, null, 'allstats last advanced'));
* ORDER_ITEM을보면 E-Rows가 29M으로 많이 조회된다
--사전 분석
select TABLE_NAME, COLUMN_NAME, DATA_TYPE, NUM_DISTINCT
from dba_tab_columns
where TABLE_NAME IN ('ORDER_ITEMS','ORDERS','CUSTOMERS','EMPLOYEES')
and NUM_DISTINCT > 0
order by NUM_DISTINCT DESC;
create index IDX_ORDITEM_ORDID on order_items(ORDER_ID);
* A-Time이나 Buffer등 확 줄은 것을 확인할 수 있다.
-- 순서 지정
순서 힌트 지정 이유는 옵티마이저가 설정한 최적실행 경로 순서를 힌트로 줌으로써 혹시 나중에 실행 순서가 바뀌더라도 이전의 실행순서를 따르게 하기 위함
SELECT /*+ LEADING (A, C, D, B) */
A.ORDER_ID,
A.ORDER_DATE,
A.ORDER_MODE ,
C.FIRST_NAME EMPNAME,
D.CUST_FIRST_NAME ,
B.PRODUCT_ID,
B.UNIT_PRICE,
B.QUANTITY
FROM ORDERS A,
ORDER_ITEMS B,
EMPLOYEES C,
CUSTOMERS D
WHERE A.ORDER_ID = B.ORDER_ID
AND A.EMPLOYEE_ID = C.EMPLOYEE_ID
AND A.CUSTOMER_ID = D.CUSTOMER_ID
AND A.ORDER_DATE >= TO_DATE('20120101', 'YYYYMMDD')
AND A.ORDER_DATE < TO_DATE('20120102', 'YYYYMMDD') ;
'Study Note > Database' 카테고리의 다른 글
Recovery 원리 (0) | 2016.02.26 |
---|---|
파티션 테이블(partition table) - 인덱스(index) (0) | 2016.02.25 |
파티션 테이블(partition table) (0) | 2016.02.24 |
Index Organized Table (IOT) (0) | 2016.02.23 |
Index 생성 속도 향상 - parallel, nologging 옵션 (0) | 2016.02.23 |