튜닝실력 점검차 처음으로 SQLP 49회 시험을 응시하였습니다.
완전 동일하지는 않겠지만 자격증카페에 복기된 내용을 토대로 문제를 복기해 보았습니다.
SQLP를 준비중이신 분들께 도움이 되었으면 좋겠습니다.
[실기1] 나이가 20살인 고객중 최근 일주일 이내 주문 이력이 있는 고객을 고객번호순으로 10건 출력하는 sql을 작성하고 아래 실행계획으로 유도하는 힌트를 적으시오.
--오브젝트 정보
create table 고객 (
고객번호 VARCHAR(5),
고객명 VARCHAR(120),
출생연월 VARCHAR(4),
등급번호 VARCHAR(5)
);
create table 고객등급 (
등급번호 VARCHAR(5),
등급명 VARCHAR(100)
);
create table 주문 (
주문일시 DATE,
고객번호 VARCHAR(5)
)
PARTITION BY RANGE (주문일시)
(
PARTITION P_20230907 VALUES LESS THAN (TO_DATE('20230908','YYYYMMDD')),
PARTITION P_20230908 VALUES LESS THAN (TO_DATE('20230909','YYYYMMDD')),
PARTITION P_20230909 VALUES LESS THAN (TO_DATE('20230910','YYYYMMDD')),
PARTITION P_20230910 VALUES LESS THAN (TO_DATE('20230911','YYYYMMDD')),
PARTITION P_20230911 VALUES LESS THAN (TO_DATE('20230912','YYYYMMDD')),
PARTITION P_20230912 VALUES LESS THAN (TO_DATE('20230913','YYYYMMDD')),
PARTITION P_20230913 VALUES LESS THAN (TO_DATE('20230914','YYYYMMDD')),
PARTITION P_20230914 VALUES LESS THAN (MAXVALUE)
);
CREATE INDEX 고객_X1 ON 고객(출생연월, 고객번호);
CREATE INDEX 주문_X1 ON 주문(고객번호, 주문일시);
--실행결과
/*
고객번호 고객명 등급명
*/
--실행계획
/*
----------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 |
|* 1 | TABLE ACCESS FULL | 고객등급| 0 | 1 | 0 |00:00:00.01 |
|* 2 | COUNT STOPKEY | | 1 | | 0 |00:00:00.01 |
| 3 | VIEW | | 1 | 1 | 0 |00:00:00.01 |
| 4 | NESTED LOOPS SEMI | | 1 | 1 | 0 |00:00:00.01 |
| 5 | TABLE ACCESS BY INDEX ROWID| 고객 | 1 | 1 | 0 |00:00:00.01 |
|* 6 | INDEX RANGE SCAN | 고객_X1| 0 | 1 | 0 |00:00:00.01 |
| 7 | PARTITION RANGE ITERATOR | | 0 | 1 | 0 |00:00:00.01 |
|* 8 | TABLE ACCESS FULL | 주문 | 0 | 1 | 0 |00:00:00.01 |
----------------------------------------------------------------------------------------
*/
49회 실기문제는 모두 SQL을 작성하고 주어진 실행계획으로 유도하는 힌트를 적는 문제였습니다.
튜닝을하는데 실행계획을 읽고 어떻게 동작했을지 상상하는 능력도 중요하기때문인것 같습니다.
실행계획은 제가 임의로 오브젝트를 생성하고 작성한 쿼리를 적은거라 ROW수나 수행시간은 의미가 없고,
기억에 따르면 COUNT STOPKEY, NESTED LOOPS SEMI, PARTITON RANGE ITERATOR가 있어 해당 Operation이 나올수 있도록 유도하는 힌트 작성이 포인트였습니다.
아래는 제가 생각하는 점수 기준입니다.
1. NESTED LOOPS SEMI 실행계획 유도 힌트를 작성하였는가(UNNEST NL_SJ)
2. COUNT STOPKEY가 동작할수 있도록 쿼리를 작성하였는가 (ROWNUM <= 10)
3. 등급명을 구하는 스칼라서브쿼리를 페이징처리 바깥에 기술하였는가
4. PARTITION RANGE INTERATOR가 동작할수있도록 주문일시컬럼을 가공하지 않고 일주일이내 주문건을 추출하는 쿼리를 작성하였는가
5. 고객테이블 인덱스 스캔이 가능하도록 출생연월컬럼을 가공하지 않고 20살 고객을 추출하였는가
개인적으로는 복기하면서 확인해보니 20살인 고개추출하는 쿼리 작성부분에서 출생연월 처리가 미흡했던것같습니다ㅠ
SQLP 시험을 보면서 부족한점도 깨닫고 더 공부해야할부분을 알게됐습니다.
결과가 확실치 않아 사전점수 결과를 기다려봐야할것같아요.
게시글을 읽는 49회 SQLP시험을 응시하시는 분들께 좋은 결과가 있길 바랍니다:)
'IT성장일기' 카테고리의 다른 글
| [스터디/The Logical Optimizer]쿼리변환개념 (0) | 2024.03.19 |
|---|---|
| [교육/SQL튜닝]조인의 원리와 활용 (1) | 2023.11.27 |
| [친절한SQL튜닝/온라인스터디]인덱스 튜닝 (0) | 2023.08.07 |
| [스터디/친절한SQL튜닝]소트튜닝 (0) | 2023.08.04 |
| [스터디/친절한SQL튜닝]서브쿼리 조인 (0) | 2023.07.10 |