오늘은 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 정보를 확인한 모습

sql_handle 조회

select * from sys.dm_exec_requests 
where status = 'running'

 

위 쿼리는 sql_handle 및 plan_handle을 조회하는 쿼리로 sql_text 를 구할때는 아래 쿼리문을 사용해야한다. 

 

select * from sys.dm_exec_sql_text(sql_handle)

 

 

SQL Text 출력


Query Hash란?

Query Hash : Oracle SQL ID 와 유사한 개념으로, SQL 텍스트를 기반으로 생성된 쿼리 해시 값.

- 유사한 SQL을 그룹핑 하는데 사용함. 

- 성능 분석 및 자동 튜닝, 쿼리 그룹핑등에 사용됨.

 

sys.dm_exec_query_stats 파라미터 사용

아래는 간단하게 조회된 SQL 에 대한 Query Hash, Query Plan Hash 조회값이다.

sys.dm_exec_query_stats 조회 결과

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 를 조회해봅니다.

 

DB에 부하를 발생시키는 long running query 강제 실행

 

최초 조회한 쿼리의 SQL ID 는 0x02000000DD69EF34F714DD6EBCFCAF32A72676D595EE14C90000000000000000000000000000000000000000

입니다. 이제 기존의 SQL Text 에 스페이스 바를 입력하여 쿼리의 변화를 주겠습니다. 

SQL ID 와 SQL Text 조회 결과값

 

기존의 쿼리에서 sysobjects o 항목에 스페이스바를 추가해주었습니다.

변화를 준 SQL Text

 

SQL ID가 0x02000000B1CFC72553CF1C92975EAC837C2072928BECF4940000000000000000000000000000000000000000

로 변하였습니다. 

 

SQL ID 와 SQL Text 조회 결과

 

이렇듯 실제 결과값은 동일하고 논리적인 쿼리의 수행과정 및 실행계획도 같은 쿼리지만, 스페이스바 하나로 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

+ Recent posts