Sql-Server

如何在不失去排序順序的情況下將跟踪文件傳輸到跟踪表中?

  • September 12, 2016

我已經使用 Profiler GUI 將一些數據跟踪到 Sql Server 的跟踪表中。該表具有以下結構:

在此處輸入圖像描述

它在 TEXTDATA 列中包含 SQL 語句和執行計劃。我發現通常屬於select語句的執行計劃xml已經放在sql語句之前的行中。

因此,例如在行中的 Select 語句的執行計劃

$$ ROWNUMBER $$= 60 通常可以在與$$ ROWNUMBER $$= 59. 這似乎很有彈性(足以滿足我的目的),我想保留這種關係以供以後使用。(到目前為止,我找不到另一種同時擷取查詢和計劃的方法 - 理想情況下,它應該作為一個合併結果出現,例如附加到評論中的查詢的計劃……但我無法創建那。)

但是,為了避免使用 Profiler GUI 的巨大成本,我創建了一個跟踪腳本,將結果儲存到跟踪文件中(因為不幸的是,使用腳本無法將結果直接重定向到表中),然後將跟踪文件導入使用以下語句的表:

SELECT * INTO mytracetable FROM ::fn_trace_gettable('c:\traces\myTraceFile.trc', default)

不幸的是,這會產生不同的表結構,最糟糕的是,ROWNUMBER 標識列現在失去了,因此記錄被弄亂了,並且不可能找到屬於查詢的計劃。

問 1:是否可以從跟踪文件創建一個表,該表的行儲存順序類似於跟踪表分析器創建的順序?

問題 2:有沒有人知道另一種更好的方法來獲取這些資訊而不使用探查器 GUI?

在創建問題過程中,我想出了一個方法:

SELECT IDENTITY(int, 1, 1) AS RowNumber, EventClass, TextData, Duration, SPID, BinaryData, ServerName, DatabaseName INTO trace_table3
FROM fn_trace_gettable('c:\traces\myTraceFile.trc', default);

成功了。結果以與跟踪表中相同的方式保持“在一起”。

http://zarez.net/?p=228

https://msdn.microsoft.com/de-de/library/ms188425(v=sql.120).aspx

我試圖跟踪函式 fn_trace_gettable 的執行,以了解它如何命令記錄以使它們再次排列,但當然除了執行本身之外什麼都沒有出現。

但是,這回答了問題 1,我得到了想要的結果。

編輯:正如 AaronBertrand 在評論中建議的那樣,事件序列以非常可靠地包含 SQL 語句之前的計劃(列/類型 51)的順序傳遞事件。這是比身份更好的方法。

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