Sql-Server
如何監控 SQL Server 數據庫?
我有 SQL Server 2008,上面有多個數據庫。該伺服器上的 CPU 獲得率高達 100%。我想弄清楚哪個數據庫可能導致它。這樣做的簡單方法是什麼?
我的“神奇” idal 工具會告訴我:
- SQL Server 的 CPU、RAM 和 IO
- 向下鑽取並為每個數據庫顯示相同的內容
- 向下鑽取並顯示導致問題的查詢等。
我更喜歡使用來自系統視圖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