Azure SQL Managed Instance 및 SQL Server 2016 Later에서 대기 통계 분석
· Version : Azure SQL, SQL Server 2016 Later
대기 통계(Wait Statistics)는데이터베이스 엔진에서 무언가를 기다리는 쿼리를 식별하는데 도움이 되며 쿼리 지속시간이 긴 이유를 분석할 수 있는 정보를 나타낸다. 이번 포스트에서는 워크로드가 대기하는 이유와 일부 리소스에서 대기중인 쿼리를 식별하는 방법에 대해서 살펴본다.
Azure SQL Managed Instance를 사용하면 아래 DMV를 사용하여 쿼리가 리소스를 대기하는 이유를 찾을 수 있다.
· sys.dm_os_wait_stats : 인스턴스 레벨에서 대기 정보 반환
· sys.query_store_wait_stats : 데이터베이스 레벨에서 대기중인 쿼리의 실행계획 반환
이러한 정보는 DMO/Query Store를 사용하여 찾을 수 있다. 그러나 분석을 쉽게 하기 위해 무료 오픈소스인 QPI 라이브러리를 사용할 수 있다.
· QPI : https://github.com/JocaPC/qpi
QPI 라이브러리를 설치하려면 아래 링크에서 SQL Server 버전에 대한 SQL 스크립트를 다운로드 할 수 있다. Query Store에 의존하기 때문에 SQL Server 2016 이상, Azure SQL 에서 가능하다.
· QPI Installation : https://github.com/JocaPC/qpi#installation
sys.dm_os_wait_stats 는 인스턴스 시작 이후 또는 통계를 마지막으로 재설정 한 이후에 대기 통계를 수집하므로 대기 통계의 스냅샷을 작성하거나 최소한 재설정을 해야한다. 아래 스크립트를 실행하여 QPI에서대기 통계를 재설정 할 수 있다.
exec qpi.snapshot_wait_stats |
이 절차는 인스턴스의 대기 통계를 재설정하고 관리형 인스턴스는 새 대기 통계를 수집을 시작한다. 워크로드가 실행되는 동안 qpi.wait_stats보기에서 대기 통계 정보를 읽을 수 있다. 결과를 보면 인스턴스의 기본 대기 통계는 INSTANCE_LOG_RATE_GOVERNON이며 Log Rate Governor로 분류 된다. 대기 유형의 영향을 받는 쿼리를 찾으려면 실제 대기 유형 이름이 아닌 쿼리 저정소에서 Category를 사용해야 하므로 Category가 중요하다. 쿼리 저장소의 대기 통계는 대기 유형별로 기록되지 않는다.
대기가 발생한 Category의 영향을 받는 상위 쿼리를 보려면 qpi.db_query_wait_stats 보기를 사용하여 Category에 해당하는 대기 통계를 필터링 할 수 있다.
예제의 경우 관리형 인스턴스에서 로그 속도 제한에 도달하고 있으며, 원인은 인덱스 재구축으로 인한것일 수 있다. 데이터베이스가 여러개인 경우 데이터베이스마다 쿼리 저장소가 구성되므로 각 데이터베이스에서 이 쿼리를 실행해야한다.
[참고자료]
2019-09-23/ Sungwook Kang / http://sungwookkang.com
Azure SQL, SQL Server Managed Instance, Query Store, QPI, sys.dm_os_wait_stats, sys.query_store_wait_stats
출처: https://sqlmvp.tistory.com/1348 [Database Lab]