테마
고객센터 화면과 모바일 앱 홈 화면은 같은 SQL로 고객 한 명의 상태별 주문 수와 금액(「주문 요약」)을 보여 준다. 화요일 오후 박팀장이 AWR 보고서를 보냈다. 「SQL ordered by Gets」 1위가 이 SQL이고, 월요일 보고서에서는 37위였다. 화요일 오전에 모바일 앱의 새 판이 나갔지만 DB 쪽 배포는 없었다. 오과장은 이렇게 말했다. "월요일 밤에 자동 통계 수집이 돌았으니 계획이 바뀐 거예요. 월요일 계획을 AWR에서 꺼내 베이스라인으로 박죠." 조민우가 AWR의 SQL 이력을 뽑았다.
T_ORD: 100,000행 · 896블록 · 고객 2,000명 · 고객당 주문 약 50건PK_T_ORD (ORD_SEQ) · IX_T_ORD_CUS_DT (CUS_ID, ORD_DT)T_ORD의 LAST_ANALYZED는 지난주 목요일 22:07(월요일 밤에는 STALE이 아니어서 자동 수집이 건너뛰었다)-- 화면과 앱이 같이 쓰는 SQL (SQL_ID 8fz3m1wq2c7d4)
SELECT ORD_ST, COUNT(*) AS ORD_CNT, SUM(ORD_AMT) AS ORD_AMT
FROM T_ORD
WHERE CUS_ID = :cus_id
GROUP BY ORD_ST;
-- 오과장 안 : 월요일 오전 스냅샷에서 계획을 꺼내 베이스라인으로 고정한다
DECLARE
n PLS_INTEGER;
BEGIN
n := DBMS_SPM.LOAD_PLANS_FROM_AWR(
begin_snap => 4417,
end_snap => 4419,
basic_filter => q'[sql_id = '8fz3m1wq2c7d4']');
END;
/
[DBA_HIST_SQLSTAT · SQL_ID 8fz3m1wq2c7d4 · 1시간 스냅샷]
SNAP_ID 시작 PLAN_HASH_VALUE EXECUTIONS_DELTA BUFFER_GETS_DELTA ROWS_PROCESSED_DELTA ELAPSED_TIME_DELTA
4418 월 10:00 1840227316 2,012 104,630 4,628 1.21초
4419 월 11:00 1840227316 2,105 109,460 4,842 1.27초
4442 화 10:00 1840227316 121,480 6,317,110 279,404 72.60초
4443 화 11:00 1840227316 118,960 6,185,920 273,608 71.41초
[DBA_HIST_ACTIVE_SESS_HISTORY · 같은 SQL_ID · 화 10:00 ~ 12:00 · MODULE별 표본 수]
MOBILE_HOME 13
CS_ORDER 1
[DBA_OPTSTAT_OPERATIONS · 월요일 밤]
22:00:03 ~ 22:14:41 gather_database_stats (auto optimizer stats collection) · 모은 테이블 3개 (T_ORD 없음)
[지금 커서 · ALLSTATS LAST · 고객 한 명]
Plan hash value: 1840227316
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 2 |00:00:00.01 | 52 |
| 1 | HASH GROUP BY | | 1 | 3 | 2 |00:00:00.01 | 52 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| T_ORD | 1 | 50 | 50 |00:00:00.01 | 52 |
|* 3 | INDEX RANGE SCAN | IX_T_ORD_CUS_DT | 1 | 50 | 50 |00:00:00.01 | 2 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("CUS_ID"=:CUS_ID)