SQL-빠른 팁 #11 - 가장 집약적인 쿼리

11719 단어 tsqlmssqlsqlserversql

SQL Server 팁과 요령



이것은 제가 1년 동안 축적한 일련의 빠른 팁과 요령 중 일부이며 다른 사람들에게 유용할 수 있다고 생각합니다.
비슷한 짧은 팁과 요령이 있으면 의견을 남겨주세요.

가장 집약적인 쿼리



데이터베이스로 작업하는 우리 대부분은 어느 시점에서 데이터베이스가 예상대로 수행되지 않는 이유를 찾아야 하는 작업을 받게 되며 데이터베이스 사용량이 많은 대규모 시스템을 실행할 때 원인이 무엇인지 알아내는 것은 매우 까다로울 수 있습니다. .
아래 쿼리는 System dynamic Management View dm_exec_query_stats를 사용하여 SQL Server의 캐시된 쿼리 계획에 대한 성능 통계를 나열합니다.
스크립트는 쿼리가 CPU를 가장 많이 사용하는 몇 가지 힌트를 제공합니다.

SELECT SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
                           ((CASE qs.statement_end_offset
                                        WHEN -1 THEN DATALENGTH(qt.TEXT)
                                        ELSE qs.statement_end_offset
                           END
                           - qs.statement_start_offset)/2)+1)
                           as [Text],
       qs.execution_count,
       qs.total_logical_reads, qs.last_logical_reads,
       qs.total_logical_writes, qs.last_logical_writes,
       qs.total_worker_time,
       qs.last_worker_time,
       -- converting microseconds to seconds
       qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
       qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
       qs.last_execution_time,
       qp.query_plan
  FROM sys.dm_exec_query_stats qs
        -- Retrieve the query text
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
        -- Retrieve the query plan
        CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
 ORDER BY qs.total_worker_time DESC -- CPU time

SELECT TOP 50
       [Avg. MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000 / qs.execution_count,
       [Total MultiCore/CPU time(sec)] = qs.total_worker_time / 1000000,
       [Avg. Elapsed Time(sec)] = qs.total_elapsed_time / 1000000 / qs.execution_count,
       [Total Elapsed Time(sec)] = qs.total_elapsed_time / 1000000,
       qs.execution_count,
       [Avg. I/O] = (total_logical_reads + total_logical_writes) / qs.execution_count,
       [Total I/O] = total_logical_reads + total_logical_writes,
       Query = SUBSTRING(qt.[text], (qs.statement_start_offset / 2) + 1,
             (
                    (
                           CASE qs.statement_end_offset
                                 WHEN -1 THEN DATALENGTH(qt.[text])
                                 ELSE qs.statement_end_offset
                           END - qs.statement_start_offset
                    ) / 2
             ) + 1
       ),
       Batch = qt.[text],
       [DB] = DB_NAME(qt.[dbid]),
       qs.last_execution_time,
       qp.query_plan
  FROM sys.dm_exec_query_stats AS qs
 CROSS APPLY sys.dm_exec_sql_text(qs.[sql_handle]) AS qt
 CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
 WHERE qs.execution_count > 5      --more than 5 occurences
 ORDER BY [Total MultiCore/CPU time(sec)] DESC


좋은 웹페이지 즐겨찾기