Sql-Server

記錄所有 SQL Server 查詢及其持續時間

  • February 5, 2021

有沒有辦法記錄在某個伺服器上執行的所有 Microsoft SQL Server 查詢及其各自的持續時間?

我希望能夠分析所有查詢,就像PGBADGER為 PostgreSQL 所做的那樣。當我們在這裡的時候:你知道任何這樣的工具嗎?

你的實際目標是什麼?您是想追踪一個麻煩的查詢,調整整個環境的性能,還是只是出於好奇?

最終,我不建議嘗試跟踪和記錄所有查詢。我懷疑您只真正關心性能不佳的查詢,這些查詢會產生實際的業務影響。

在大多數生產伺服器上,您將擁有更多的查詢,這些查詢要麼執行得足夠快,以至於即使 10-20% 的性能提升也幾乎無法察覺,或者已經優化到足以使任何性能調整都浪費您的時間。

因此,我建議將您的性能調整定位到實際需要它的查詢。

無論如何,您有幾個選擇:

查詢儲存

如果您執行的是 SQL 2016 或更高版本,則查詢儲存是我的首選方法。它的成本非常低,並提供了一些簡潔的方法來跟踪查詢性能。Books Online 有一篇關於使用它的好文章。請注意,它需要為每個數據庫啟用,並且只有在啟用後才會擷取資訊。

車管所

sys.dm_exec_query_stats儲存圍繞查詢執行的聚合(按查詢計劃)統計資訊。這對於查看哪些查詢在伺服器上消耗最多資源的高級視圖非常有用。您不會獲得單獨的執行統計資訊(除非它只執行一次),因此它並不真正適合辨識具有通常表現良好的查詢的“一次性”性能問題。

它不包括語句文本,但您可以使用 sys.dm_exec_sql_text DMF 獲取它。舉個例子:

select top 100 
   qt.text
   , qs.execution_count
   , qs.total_worker_time
   , qs.total_physical_reads
   , qs.total_logical_reads
   , qs.total_physical_writes
   , qs.total_logical_writes
   , qs.creation_time
   , qs.last_execution_time
from
   sys.dm_exec_query_stats as qs
cross apply 
   sys.dm_exec_sql_text(qs.sql_handle) as qt
order by 
   total_worker_time desc

擴展活動

如果您真的準備擷取每一個查詢,那麼最好的選擇是使用 XE。了解如果您沿著這條路線走,將會有很大的性能成本(特別是如果您正在擷取諸如呼叫堆棧之類的東西,或者正在做一些瘋狂的事情,比如通過帶有謂詞的 sql 文本進行過濾),我不建議這樣做以任何方式。

如果你設置了這樣的東西,我建議要非常小心,不要在不監控其影響的情況下讓它執行。

引用自:https://dba.stackexchange.com/questions/202357