문제
다음 테이블과 쿼리를 보고 성능 최적화를 위한 인덱스 설계로 가장 적절한 것은?
SQLCREATE TABLE ORDERS ( ORDER_ID NUMBER, CUSTOMER_ID NUMBER, ORDER_DATE DATE, STATUS VARCHAR2(10), AMOUNT NUMBER );
SQLSELECT ORDER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID = 100 AND ORDER_DATE BETWEEN '2023-01-01' AND '2023-12-31' AND STATUS = 'COMPLETE' ORDER BY ORDER_DATE DESC;
① CREATE INDEX IX1 ON ORDERS(CUSTOMER_ID, ORDER_DATE, STATUS) ② CREATE INDEX IX1 ON ORDERS(STATUS, CUSTOMER_ID, ORDER_DATE) ③ CREATE INDEX IX1 ON ORDERS(ORDER_DATE, CUSTOMER_ID, STATUS) ④ CREATE INDEX IX1 ON ORDERS(CUSTOMER_ID, STATUS, ORDER_DATE)
정답
4번
해설
④가 정답입니다. 복합 인덱스에서는 등치조건(=)을 범위조건보다 앞에 배치해야 효율적입니다. CUSTOMER_ID(=), STATUS(=), ORDER_DATE(BETWEEN) 순으로 배치하면 가장 효율적인 인덱스 스캔이 가능합니다. ①은 STATUS가 마지막에 있어 비효율적입니다. ②는 STATUS가 첫 번째인데, CUSTOMER_ID보다 선택도가 낮을 가능성이 높아 비효율적입니다. ③은 범위조건인 ORDER_DATE가 첫 번째에 있어 이후 조건들의 인덱스 효과가 떨어집니다.