程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 監控 SQL Server 的運行狀況(1)

監控 SQL Server 的運行狀況(1)

編輯:關於SqlServer

Microsoft SQL Server 2005 提供了一些工具來監控數據庫。方法之一是動態管理視圖。動態管理視圖 (DMV) 和動態管理函數 (DMF) 返回的服務器狀態信息可用於監控服務器實例的運行狀況、診斷問題和優化性能。

常規服務器動態管理對象包括:

  • dm_db_*:數據庫和數據庫對象

  • dm_exec_*:執行用戶代碼和關聯的連接

  • dm_os_*:內存、鎖定和時間安排

  • dm_tran_*:事務和隔離

  • dm_io_*:網絡和磁盤的輸入/輸出

此部分介紹為監控 SQL Server 運行狀況而針對這些動態管理視圖和函數運行的一些常用查詢。

示例查詢

您可以運行以下查詢來獲取所有 DMV 和 DMF 名稱:

SELECT * FROM sys.system_objects
WHERE name LIKE 'dm_%'
ORDER BY name

監控 CPU 瓶頸

CPU 瓶頸通常由以下原因引起:查詢計劃並非最優、配置不當、設計因素不良或硬件資源不足。下面的常用查詢可幫助您確定導致 CPU 瓶頸的原因。

下面的查詢使您能夠深入了解當前緩存的哪些批處理或過程占用了大部分 CPU 資源。

SELECT TOP 50 
      SUM(qs.total_worker_time) AS total_cpu_time, 
      SUM(qs.execution_count) AS total_execution_count,
      COUNT(*) AS  number_of_statements, 
      qs.sql_handle 
FROM sys.dm_exec_query_stats AS qs
GROUP BY qs.sql_handle
ORDER BY SUM(qs.total_worker_time) DESC

下面的查詢顯示緩存計劃所占用的 CPU 總使用率(帶 SQL 文本)。

SELECT 
      total_cpu_time, 
      total_execution_count,
      number_of_statements,
      s2.text
      --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
FROM (SELECT TOP 50 SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, COUNT(*) AS number_of_statements, qs.sql_handle --,
--MIN(statement_start_offset) AS statement_start_offset,
--MAX(statement_end_offset) AS statement_end_offset
FROM sys.dm_exec_query_stats AS qs GROUP BY qs.sql_handle ORDER BY SUM(qs.total_worker_time) DESC) AS stats CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2

下面的查詢顯示 CPU 平均占用率最高的前 50 個 SQL 語句。

SELECT TOP 50
total_worker_time/execution_count AS [Avg CPU Time],
(SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, *
FROM sys.dm_exec_query_stats 
ORDER BY [Avg CPU Time] DESC

下面顯示用於找出過多編譯/重新編譯的 DMV 查詢。

select * from sys.dm_exec_query_optimizer_info
where 
      counter = 'optimizations'
      or counter = 'elapsed time'

下面的示例查詢顯示已重新編譯的前 25 個存儲過程。plan_generation_num 指示該查詢已重新編譯的次數。

select top 25
      sql_text.text,
      sql_handle,
      plan_generation_num,
      execution_count,
      dbid,
      objectid 
from sys.dm_exec_query_stats a
      cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
where plan_generation_num > 1
order by plan_generation_num desc

效率較低的查詢計劃可能增大 CPU 占用率。

下面的查詢顯示哪個查詢占用了最多的 CPU 累計使用率。

SELECT 
    highest_cpu_queries.plan_handle, 
    highest_cpu_querIEs.total_worker_time,
    q.dbid,
    q.objectid,
    q.number,
    q.encrypted,
    q.[text]
from 
    (select top 50 
        qs.plan_handle, 
        qs.total_worker_time
    from 
        sys.dm_exec_query_stats qs
    order by qs.total_worker_time desc) as highest_cpu_querIEs
    cross apply sys.dm_exec_sql_text(plan_handle) as q
order by highest_cpu_querIEs.total_worker_time desc

下面的查詢顯示一些可能占用大量 CPU 使用率的運算符(例如 ‘%Hash Match%’、‘%Sort%’)以找出可疑對象。

select *
from 
      sys.dm_exec_cached_plans
      cross apply sys.dm_exec_query_plan(plan_handle)
where 
      cast(query_plan as nvarchar(max)) like '%Sort%'
      or cast(query_plan as nvarchar(max)) like '%Hash Match%'
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved