DBAtlas · 데이터베이스 운영 아틀라스

가장 느린 / 비용이 큰 쿼리 찾기

Oracle

SELECT sql_id,
       ROUND(elapsed_time/1e6, 1) AS elapsed_sec,
       executions,
       ROUND(elapsed_time/1e6/NULLIF(executions,0), 3) AS sec_per_exec,
       sql_text
FROM v$sql
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;

이력 분석은 AWR(dba_hist_sqlstat)을 사용한다. sql_id로 DBMS_XPLAN.DISPLAY_CURSOR를 실행하면 실행 계획을 볼 수 있다.

PostgreSQL

SELECT calls,
       ROUND(total_exec_time::numeric, 1) AS total_ms,
       ROUND(mean_exec_time::numeric, 2) AS mean_ms,
       query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

pg_stat_statements 확장(shared_preload_libraries)이 필요하다. pg_stat_statements_reset()으로 초기화한다.

MySQL

SELECT digest_text,
       count_star AS calls,
       ROUND(sum_timer_wait/1e12, 2) AS total_sec,
       ROUND(avg_timer_wait/1e9, 2) AS avg_ms
FROM performance_schema.events_statements_summary_by_digest
ORDER BY sum_timer_wait DESC
LIMIT 10;

대안: slow_query_log = ON과 long_query_time을 설정한 슬로 쿼리 로그.

SQL Server

SELECT TOP 10
       qs.execution_count,
       qs.total_elapsed_time/1000 AS total_ms,
       qs.total_elapsed_time/qs.execution_count/1000 AS avg_ms,
       SUBSTRING(t.text, 1, 200) AS sql_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) t
ORDER BY qs.total_elapsed_time DESC;

Query Store가 활성화되어 있으면 더 풍부한 이력 분석을 위해 sys.query_store_runtime_stats를 사용한다.

MongoDB

// Enable the profiler for operations over 100ms:
db.setProfilingLevel(1, { slowms: 100 })
// Then read the slowest ones:
db.system.profile.find().sort({ millis: -1 }).limit(10)

프로파일러는 쓰기 오버헤드를 추가한다. 진단 후 db.setProfilingLevel(0)으로 끈다.

Redis

SLOWLOG GET 10
# Set the threshold (microseconds): CONFIG SET slowlog-log-slower-than 10000

slowlog-log-slower-than은 마이크로초 단위다(10000 = 10 ms). SLOWLOG RESET으로 비운다.

DBAtlas에서 열기 →