Sql-Server

如何監控 SQL Server 數據庫?

  • December 11, 2011

我有 SQL Server 2008,上面有多個數據庫。該伺服器上的 CPU 獲得率高達 100%。我想弄清楚哪個數據庫可能導致它。這樣做的簡單方法是什麼?

我的“神奇” idal 工具會告訴我:

  1. SQL Server 的 CPU、RAM 和 IO
  2. 向下鑽取並為每個數據庫顯示相同的內容
  3. 向下鑽取並顯示導致問題的查詢等。

我更喜歡使用來自系統視圖sys.dm_exec_query_stats的資訊。活動監視器對我來說不方便。

為了從我這裡獲取資訊,sys.dm_exec_query_stats我使用了我在這裡找到的以下腳本(不幸的是它是俄語的)。適用於 SQL Server 2005+。

使用此腳本,您可以按所需欄位過濾或分組查詢,更重要的是,獲取有關查詢所屬的上次執行時間和對象(SP、觸發器)的資訊(活動監視器不提供此資訊)。

該腳本的唯一缺點是它僅返回記憶體查詢計劃的聚合性能統計資訊。如果計劃因任何原因(記憶體不足、重新編譯)從記憶體中刪除,您將看不到該查詢的統計資訊。

set transaction isolation level read uncommitted
select 
   top 100
   creation_time,
   last_execution_time,
   execution_count,
   total_worker_time/1000 as CPU,
   convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
   qs.total_elapsed_time/1000 as TotDuration,
   convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
   total_logical_reads as [Reads],
   total_logical_writes as [Writes],
   total_logical_reads+total_logical_writes as [AggIO],
   convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
   case 
       when sql_handle IS NULL then ' '
       else(substring(st.text,(qs.statement_start_offset+2)/2,(
           case
               when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2      
               else qs.statement_end_offset    
           end - qs.statement_start_offset)/2  ))
   end as query_text,
   db_name(st.dbid)as database_name,
   object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
from sys.dm_exec_query_stats  qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc

引用自:https://serverfault.com/questions/339450