오늘은 MSSQL 의 튜닝과 성능분석에 도움을 주는 SQL Handle과 Query Hash 에 대하여 간단하게 알아보려고 한다.
오라클에서는 유사한 성격의 SQL ID 가 존재하지만, MSSQL 과 개념이 조금 달라서 정리해두면 좋을 것 같다.
우선 SQL Handle 이란 ?
SQL Handle : SQL 텍스트 자체를 식별하는 해시 값
- 동일한 SQL Text는 동일한 sql_handle을 가짐.
- 파라미터 값이 달라도 SQL 텍스트가 같으면 sql_handle은 동일
- 실제 SQL Text를 조회 할 때 SQL Handle을 조합하여 사용
sys.dm_exec_sql_text 파라미터 사용
sys.dm_exec_requests 파라미터로 실제 running session에 대한 sql_id 조회 후 sql_text 조회
↓ 아래는 sys.dm_exec_requests 파라미터를 활용하여 아주 간단하게 running session 에 대한 query 정보를 확인한 모습
select * from sys.dm_exec_requests
where status = 'running'
위 쿼리는 sql_handle 및 plan_handle을 조회하는 쿼리로 sql_text 를 구할때는 아래 쿼리문을 사용해야한다.
select * from sys.dm_exec_sql_text(sql_handle)
Query Hash란?
Query Hash : Oracle SQL ID 와 유사한 개념으로, SQL 텍스트를 기반으로 생성된 쿼리 해시 값.
- 유사한 SQL을 그룹핑 하는데 사용함.
- 성능 분석 및 자동 튜닝, 쿼리 그룹핑등에 사용됨.
sys.dm_exec_query_stats 파라미터 사용
아래는 간단하게 조회된 SQL 에 대한 Query Hash, Query Plan Hash 조회값이다.
SELECT query_hash, query_plan_hash, execution_count
FROM sys.dm_exec_query_stats;
실제 SQL Handle의 경우는 SQL 텍스트를 식별하는 식별자의 역할을 한다고 정의되어 있는데, 실제로 스페이스바 하나의 실제 논리적인 쿼리 결과값은 동일할지라도, 실제적인 쿼리문의 변화가 생겼을때 SQL handle 이 변화하는지 예제를 통해 실습해보고자 합니다.
우선 DB에 부하를 발생 시킬 수 있는 long running query를 수행하고, 위의 예제 쿼리를 활용하여 실제 sql text와 SQL ID 를 조회해봅니다.
최초 조회한 쿼리의 SQL ID 는 0x02000000DD69EF34F714DD6EBCFCAF32A72676D595EE14C90000000000000000000000000000000000000000
입니다. 이제 기존의 SQL Text 에 스페이스 바를 입력하여 쿼리의 변화를 주겠습니다.
기존의 쿼리에서 sysobjects o 항목에 스페이스바를 추가해주었습니다.
SQL ID가 0x02000000B1CFC72553CF1C92975EAC837C2072928BECF4940000000000000000000000000000000000000000
로 변하였습니다.
이렇듯 실제 결과값은 동일하고 논리적인 쿼리의 수행과정 및 실행계획도 같은 쿼리지만, 스페이스바 하나로 SQL ID 는 변경되는 것을 확인 할 수 있습니다.
이렇게 간단하게 오늘은 쿼리 분석과 튜닝에 도움을 줄 수 있는 SQL Handle 과 Query Hash 에 대하여 알아보았습니다.
다음에도 DB 분석 및 쿼리 튜닝에 도움이 되는 항목이 있으면 함께 공유해보도록 하겠습니다.
'Database | SQL | OS > MS-SQL' 카테고리의 다른 글
MSSQL 2019 설치 (0) | 2025.02.24 |
---|---|
MSSQL 쿼럼과 구성 방법 (0) | 2025.02.18 |
MSSQL 2016 -> MSSQL 2019 DB 업그레이드 (3) | 2025.02.05 |
Always On 테이블 동기화 테스트 (6) | 2025.02.04 |
Always On Failover 테스트 (1) | 2025.02.03 |