🚨 이슈 내용
mybatis에서 호출 하는 쿼리 속도와 SSMS에서 호출 하는 쿼리 속도의 차이가 발생하는 경우에 대해서 내용을 정리 하려고 한다.
레거시 시스템 기준으로 mybatis를 통해서 쿼리를 작성하고 호출하는 방식의 개발이 되어 있고, 유지보수를 하는 과정에서 쿼리에 대한 개선이 이뤄지는 경우 두개의 쿼리의 속도 차이가 발생할때가 있다.
mssql 자체에서 플랜 캐싱 처리시, 최적화를 해야하지만 이부분이 정상 동작하지 않아서 잘못된 계획이 계속 캐싱으로 잡혀있고 이로인해서 직접 호출과 mybatis에서 호출하는 부분의 속도 차이가 발생 한다.
👨⚕️ 해결 방안
상위 리소스 소비 쿼리 (query_hash 기준 집계 기준)
SELECT TOP 50
qs.query_hash,
qs.query_plan_hash,
SUM(qs.execution_count) AS exec_count,
SUM(qs.total_elapsed_time) / 1000.0 AS total_ms,
SUM(qs.total_logical_reads) AS total_reads,
SUM(qs.total_worker_time) / 1000.0 AS total_cpu_ms,
MIN(qs.creation_time) AS first_seen,
MAX(qs.last_execution_time) AS last_seen
FROM sys.dm_exec_query_stats AS qs
GROUP BY qs.query_hash, qs.query_plan_hash
ORDER BY total_ms DESC;
특정 쿼리 텍스트/플랜 보기
SELECT
DB_NAME(st.dbid) AS db_name,
st.text,
qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
WHERE qs.query_hash = 0x... -- 위에서 확인한 값으로 필터링
OPTION (RECOMPILE);
쿼리 기준으로 캐싱 제거
DBCC FREEPROCCACHE (0x...plan_handle...);
전체 캐싱 제거
(순간적으로 호출되는 쿼리의 속도가 전부 느려지기 때문에 확인후 작업 필요)
DBCC FREEPROCCACHE;반응형