SQL Server 擴充的事件目標

SQL Server 擴充的事件目標是事件取用者。目標可以寫入檔案、彙總事件資料,或是啟動與事件相關的工作。目標也能夠同步或非同步處理資料。

擴充的事件設計可保證目標一定會收到事件一次,而且每個工作階段只會收到一次。

擴充的事件會提供下列幾個目標,您可將其用於擴充的事件工作階段:

  • 事件儲存

    用於根據指定的事件資料行或動作,計算指定事件的發生次數。

  • 事件配對

    許多種類的事件都是以成對的形式發生,例如鎖定取得和鎖定釋放。用於判斷指定配對事件不會發生在相符集合中的時機。

  • Windows 事件追蹤 (ETW)

    用於建立 SQL Server 事件與 Windows 作業系統或應用程式事件資料的關聯。

  • 事件檔案

    用於將完成記憶體緩衝區的事件工作階段輸出寫入磁碟。

  • 同步事件計數器

    計算所有指定的事件於擴充的事件工作階段期間發生的數目。用於取得有關工作負載特性的資訊,而不會增加完整事件收集的負擔。

  • 信號緩衝區

    用於根據先進先出 (FIFO) 規則或每一個事件的 FIFO 規則,將事件資料存放於記憶體。

目標可以劃分為檔案目標和記憶體中目標。

  • 事件檔案目標與 ETW 目標視同檔案目標。

  • 事件儲存、事件配對、同步事件計數器與信號緩衝區目標視同記憶體中目標,其資料會儲存在工作階段的緩衝區 (sys.dm_xe_session_targets 動態管理檢視的 target_data 資料行)。

請注意,使用記憶體中目標的工作階段一旦停止,儲存在該工作階段緩衝區的所有資訊都將遺失。如果想要在停止工作階段之後存取事件資料,請將工作階段設定為使用檔案目標 (建議),或先儲存資料再停止工作階段。

您可以參照下列方針,協助您決定應使用哪一種目標。

目標

建議用法

事件檔案目標或 ETW 目標

在下列一個或多個條件為真時,使用檔案目標:

  • 您想要執行長期的資料收集。

  • 您想要收集極大量事件的資料。

  • 您想要保存事件資料做為歷程記錄。

信號緩衝區目標

在下列條件為真時,使用信號緩衝區目標:

  • 您想要對持續收集的資料執行循環追蹤,但只在意最近發生的事件 (大約 2 MB 的事件資料)。或者,您想要執行短期的資料收集,並且檢視最近發生的事件。

  • 您想要檢視所有擷取至工作階段緩衝區的事件資料。也就是說,您想要檢視原始資料而非彙總資訊。

  • 您不需要保存事件資料做為歷程記錄。

事件儲存目標、事件配對目標或同步事件計數器目標

在下列條件為真時,使用這三種記憶體中目標的其中一種:

  • 您想要使用能夠執行某種形式的事件資料分析與彙總的目標來疑難排解特定問題。例如,您可能要知道是否有任何交易仍保持開啟 (事件配對目標),或是查看特定期間內依 CPU 使用量排名最前的查詢 (事件儲存目標)。

  • 您想要執行短期的資料收集。

  • 您不需要保存事件資料做為歷程記錄。

事件儲存目標

事件儲存目標會根據事件資料來分組特定事件類型的發生。「值區」是事件的群組,這些事件會根據指定的事件資料行或動作來計算。您可以使用事件儲存目標來排除效能問題。藉由識別哪些事件最常發生,您可以尋找「作用點」來指出效能問題的可能原因。

下表說明可用來設定事件儲存目標的選項。

選項

允許的值

說明

slots

任何整數值。這是選擇性的值。

使用者指定的值,指示要保留的值區數目上限。當到達這個值時,會忽略不屬於現有值區的新事件。

filtering_event_name

擴充的事件工作階段中所存在的任何事件。這是選擇性的值。

使用者指定的值,用來識別事件類別。只有指定之事件的執行個體才會儲存起來,所有其他事件則會忽略。

如果您指定這個值,您必須使用 package_name.event_name 格式,例如 'sqlserver.checkpoint_end'。您可以使用下列查詢來識別封裝名稱:

SELECT p.name, se.event_name
FROM sys.dm_xe_session_events se
JOIN sys.dm_xe_packages p
ON se_event_package_guid = p.guid
ORDER BY p.name, se.event_name

如果您未指定 filtering_event_name 值,source_type 必須設定為 1 (預設值)。

source_type

值區所根據的物件類型。這個值是選用的值,而且如果未指定它,它的預設值為 1。

可以具有下列其中一個值:

  • 0 代表事件。

  • 1 代表動作。

source

事件資料行或動作名稱。

當做資料來源使用的事件資料行或動作名稱。

當您為來源指定事件資料行時,您必須從用於 filtering_event_name 值的事件來指定資料行。您可以使用下列查詢來識別可能的資料行:

SELECT name FROM sys.dm_xe_object_columns
WHERE object_name = '<eventname>'
AND column_type != 'readonly'

當您為來源指定事件資料行時,您不必在來源值中包含封裝名稱。

當您為來源指定動作名稱時,您必須在正在使用此目標的事件工作階段中,使用針對集合所設定的其中一個動作。若要尋找動作名稱的可能值,您可以查詢 sys.dm_xe_sesssion_event_actions 檢視表的 action_name 資料行。

如果您將動作名稱當做資料來源使用,您必須使用 package_name.action_name 格式來指定來源值。

下列範例將以高層級的方式說明事件儲存目標如何收集資料。在此範例中,您想要使用事件儲存目標來計算所發生之每一個等候類型的等候次數。若要這樣做,當您定義事件儲存目標時,您會指定下列選項:

  • filtering_event_name = 'wait_info'

  • source = 'wait_type'

  • source_type = 0 (因為 wait_type 為事件資料行)

在此案例中,將會針對 wait_type 來源記錄以下資料。

篩選事件名稱

來源資料行值

wait_info

file_io

wait_info

file_io

wait_info

network

wait_info

network

wait_info

sleep

等候類型值會分成三個值區,值和位置計數如下:

位置計數

file_io

2

network

2

sleep

1

如需有關事件儲存目標語法的詳細資訊,請參閱<如何:使用擴充的事件監視系統活動>。

儲存目標只會保留指定之來源的事件資料。在某些情況下,事件資料可能會太大而無法完整保留,此時資料會遭到截斷。當事件資料遭到截斷時,位元組數目會記錄下來並顯示為 XML 輸出。

儲存目標會將資料序列化成呼叫的程式或 XML 格式的程序。

[!附註]

儲存輸出不符合任何結構描述。

下列範例說明儲存目標輸出格式。

<Slots truncated = "0" buckets=[count]>
    <Slot count=[count] trunc=[truncated bytes]>
        <value>
        </value>
    </Slot>
</Slots>

事件配對目標

事件配對目標會使用每個事件中存在之一個或多個資料行來比對兩個事件。許多事件都是以成對的形式出現,例如鎖定取得和鎖定釋放。當事件序列配對之後,會捨棄這兩個事件。捨棄相符的事件組可讓您輕鬆偵測尚未釋放的鎖定取得。

藉由使用事件層級的篩選,配對目標可以只用來擷取不符合預設準則的事件。

當您使用事件配對目標時,便可允許您選擇將要比對的兩個事件,連同比對作業執行所在的資料行序列。此序列中的所有資料行都必須有相同的類型。

下表說明用來設定事件配對的可用選項。

選項

允許的值

描述

begin_event

存在於目前工作階段中的任何事件名稱。

指定配對序列中之開頭事件的事件名稱。

end_event

存在於目前工作階段中的任何事件名稱。

指定配對序列中之結尾事件的事件名稱。

begin_matching_columns

以逗號分隔且排序的資料行名稱清單。

要執行比對的資料行。

end_matching_columns

以逗號分隔且排序的資料行名稱清單。

要執行比對的資料行。

begin_matching_actions

以逗號分隔且排序的動作清單。

要執行比對的動作。

end_matching_actions

以逗號分隔且排序的動作清單。

要執行比對的動作。

respond_to_memory_pressure

為下列其中一個值:

  • 0 = 不回應。

  • 1 = 當有記憶體不足的壓力時,停止將新的遺棄項目加入清單中。

對記憶體事件的目標回應。如果設定為 1,而且伺服器的記憶體很少,則會移除正在維護且未成對的資訊。

所有與事件有關的資料都會擷取,並儲存起來供將來配對。此外,也會收集動作所加入的資料。收集的事件資料會儲存在記憶體中,因此會有有限度的限制。這個限制是以系統容量和活動為根據。所使用的記憶體數量將會根據可用的系統資源而定,而不會將最大記憶體數量當做參數使用。當無法使用這些項目時,將會卸除已經保留且未配對的事件。如果事件尚未配對且遭到卸除,則相符的事件將會以未配對事件的形式出現。

配對目標會將未配對的事件序列化成 XML 格式,這個格式不符合任何結構描述。此格式只包含兩個元素類型。<unpaired> 元素是根元素,後面緊接著目前正在追蹤之每一個未配對事件的一個 <event> 元素。<event> 元素包含一個屬性,此屬性則包含了未配對事件的名稱。

下列範例說明配對目標輸出格式。

<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
    <event name  = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
    <data name = "[column name]"> 
    <type name = "[column type]" package = "[type package]" /> 
    <value>[column value]</value>
    <text value>[text value]</text>>
        </data>
    </event>
</unpaired>

Windows 事件追蹤目標

在您使用 Windows 事件追蹤 (ETW) 當做目標之前,我們建議您最好具備 ETW 的實用知識。ETW 追蹤會搭配擴充的事件一起使用,或是當做擴充的事件之事件取用者使用。下列外部連結提供取得有關 ETW 之背景資訊的起點:

擴充的事件可支援 Windows XP 和 Windows Server 2003 版本的 ETW。ETW 目標是單一目標,但是此目標可加入至許多工作階段。如果某個事件在許多工作階段上引發,只會在每次發生事件時,將該事件傳播至 ETW 目標一次。在每一個處理序上,擴充的事件引擎則限制為單一執行個體。

重要事項重要事項

為了讓 ETW 目標有效,SQL Server 服務啟動帳戶必須是 Performance Log Users 群組的成員。

ETW 工作階段中的事件組態是由主控擴充的事件引擎的處理序所控制。此引擎會控制所要引發的事件以及引發事件所必須符合的條件。

當繫結至擴充的事件工作階段之後 (此工作階段會在處理序存留期間第一次附加 ETW 目標),ETW 目標會在 SQL Server 提供者上開啟單一 ETW 工作階段。如果 ETW 工作階段已經存在,ETW 目標會取得現有工作階段的參考。這個 ETW 工作階段可在給定電腦上的所有 SQL Server 執行個體之間共用,這個 ETW 工作階段會從具有 ETW 目標的工作階段中接收所有事件。

因為 ETW 需要啟用提供者,才能耗用事件並將事件往下流向 ETW,所以會在此工作階段上啟用所有擴充的事件封裝。當引發事件時,ETW 目標會傳送此事件到工作階段 (此工作階段上已啟用此事件的提供者)。

ETW 目標支援在引發事件的執行緒上同步發行事件。不過,ETW 目標不支援非同步的事件發行。

ETW 目標不支援來自外部 ETW 控制器的控制,例如 logman.exe。若要產生 ETW 追蹤,您必須使用 ETW 目標來建立事件工作階段。如需詳細資訊,請參閱<CREATE EVENT SESSION (Transact-SQL)>。

[!附註]

啟用 ETW 目標就會建立名為 XE_DEFAULT_ETW_SESSION 的 ETW 工作階段。如果具有 XE_DEFAULT_ETW_SESSION 名稱的工作階段已經存在,就會使用此工作階段,而不修改現有工作階段的任何屬性。XE_DEFAULT_ETW_SESSION 會在所有 SQL Server 執行個體之間共用。啟動 XE_DEFAULT_ETW_SESSION 之後,您必須使用 Logman 工具等 ETW 控制器來停止它。例如,您可以在命令提示字元中執行下列命令:logman stop XE_DEFAULT_ETW_SESSION -ets。

下表說明用來設定 ETW 目標的可用選項。

選項

允許的值

描述

default_xe_session_name

最多 256 個字元的任何字串。這是選擇性的值。

擴充的事件工作階段名稱。預設名稱為 XESESSION0_4B7A5EC6-37EF-4d4c-81EC-13C547B9AC46。

default_etw_session_logfile_path

最多 256 個字元的任何字串。這是選擇性的值。

擴充的事件工作階段記錄檔的路徑。預設路徑為 %TEMP%\ XEEtw.etl。

default_etw_session_logfile_size_mb

任何不帶正負號的整數。這是選擇性的值。

擴充的事件工作階段記錄檔的大小 (以 MB 為單位)。預設值是 20 MB。

default_etw_session_buffer_size_kb

任何不帶正負號的整數。這是選擇性的值。

擴充的事件工作階段記憶體內緩衝區的大小 (以 KB 為單位)。預設值是 128 KB。

重試次數

任何不帶正負號的整數。

在卸除事件之前,重試將此事件發行給 ETW 子系統的次數。預設值是 0。

上述的設定為選擇性。ETW 目標會使用這些設定的預設值。

ETW 目標負責以下工作:

  • 建立預設 ETW 工作階段。

  • 將所有擴充的事件封裝向 ETW 註冊。如此可確保 ETW 不會卸除事件。

  • 管理對 ETW 的事件流程。ETW 目標會以擴充的事件資料來建立 ETW 事件,然後將它傳送給適當的 ETW 工作階段。如果此事件大於緩衝區大小,或是資料無法納入一個 ETW 事件中,則 ETW 會將此事件分成若干片段。

  • 請隨時將擴充的事件封裝保持在啟用狀態。

下列的預設檔案位置是由 ETW 所使用:

  • ETW 輸出檔位於 %TEMP%\XEEtw.etl 中。

    重要事項重要事項

    當第一個工作階段啟動之後,將無法變更檔案路徑。

  • Managed 物件格式 (MOF) 檔案位於 <您的安裝路徑>\Microsoft SQL Server\Shared 中。如需詳細資訊,請參閱 MSDN 上的<Managed 物件格式>(英文)。

事件檔案目標

事件檔案目標是將完整緩衝區寫入磁碟的非同步目標。檔案目標會建立兩種類型的檔案:記錄和中繼資料。中繼資料檔案會描述目標輸出記錄檔內的事件內容,如此可正確剖析記錄檔內的所有事件,並同時剖析與事件相關聯的動作資料。

若要使用此目標,您必須指定記錄檔和中繼資料檔案的位置名稱。其他組態選項 (如檔案大小和成長特性) 則是選擇性。

下表說明用來設定事件檔案目標的可用選項。

選項

允許的值

描述

filename

最多 260 個字元的任何字串。這是必要的值。

檔案位置和檔案名稱。

您可以使用任何副檔名。

max_file_size

任何 64 位元整數。這是選擇性的值。

最大檔案大小 (以 MB 為單位)。如果未指定 max_file_size,檔案可以成長到磁碟已滿。預設的檔案大小為 1GB。

max_file_size 必須大於工作階段緩衝區的目前大小。如果沒有,檔案目標將無法初始化,而且系統會報告 max_file_size 無效。若要檢視緩衝區的目前大小,請在 sys.dm_xe_sessions 動態管理檢視中查詢 buffer_size 資料行。

如果預設的檔案大小小於工作階段緩衝區大小,我們建議您將 max_file_size 設定為 sys.server_event_sessions 目錄檢視中 max_memory 資料行所指定的值。

當 max_file_size 的大小設定為大於工作階段緩衝區的大小時,它可能會向下捨入到最接近工作階段緩衝區大小的倍數。這樣做可能會建立小於指定之 max_file_size 值的目標檔案。例如,如果緩衝區大小是 100MB 而且 max_file_size 設定為 150MB,則產生的檔案就會向下捨入到 100MB,因為其餘 50MB 的空間無法容納第二個緩衝區。

如果預設的檔案大小小於工作階段緩衝區大小,我們建議您將 max_file_size 設定為 sys.server_event_sessions 目錄檢視中 max_memory 資料行的值。

max_rollover_files

任何 32 位元整數。這是選擇性的值。

要保留在檔案系統中的最大檔案數。

increment

任何 32 位元整數。這是選擇性的值。

檔案的累加成長 (以 MB 為單位)。如果未指定,increment 的預設值就是工作階段緩衝區大小的兩倍。

metadatafile

最多 260 個字元的任何字串。這是必要的值。

檔案之中繼資料的位置和名稱。

第一次建立檔案目標時,您所指定的檔案名稱會附加 0 和一個長整數值。這個整數值會計算成介於 1600 年 1 月 1 日與建立檔案之日期和時間之間的毫秒數。後續的換用檔案也會使用這個格式。透過檢查長整數的值,您就可以判斷出最新的檔案。下列範例說明您將檔案名稱選項指定為 C:\OutputFiles\MyOutput.xel 的情況下,要如何命名檔案:

  • 建立的第一個檔案 - C:\OutputFiles\MyOutput_0_128500310259380000.xel

  • 第一個換用檔案 - C:\OutputFiles\MyOutput_0_128505831770890000.xel

  • 第二個換用檔案 - C:\OutputFiles\MyOutput_0_132410772966237000.xel

同步事件計數器目標

同步事件計數器目標會計算擴充的事件工作階段期間引發的所有事件。使用同步事件計數器目標,可讓您取得有關工作負載特性的資訊,而不會增加完整事件收集的負擔。此目標沒有任何可自訂的參數。

下列範例說明同步事件計數器目標輸出。

<CounterTarget truncated = "0">
  <Packages>
    <Package name = "[package name]">
      <Event name = "[event name]" count = "[number]" />
    </Package>
  </Packages>
</CounterTarget>

環緩衝區目標

環緩衝區目標會短暫地將事件資料保留在記憶體中,此目標可以在兩個模式的其中一個之下管理事件。

  • 第一個模式是嚴格的先進先出 (FIFO),當使用配置給目標的所有記憶體時,將會捨棄最舊的事件。在此模式中 (預設值),occurrence_number 選項設定為 0。

  • 第二個模式是依事件的 FIFO,將會保留每一個類型之事件的指定數目。在此模式中,當使用配置給目標的所有記憶體時,將會捨棄每一個類型的最舊事件。您可以設定 occurrence_number 選項,以指定要保留之每一個類型的事件數目。

下表說明用來設定信號緩衝區目標的可用選項。

選項

允許的值

描述

default_memory

任何 32 位元整數。這是選擇性的值。

要使用的最大記憶體數量 (以 KB 為單位)。當到達這個值時,將會捨棄現有的事件。

occurrence_number

為下列其中一個值:

  • 0 (預設值) = 當使用配置給目標的所有記憶體時,將會捨棄最舊的事件。

  • 任何 32 位元整數 = 在根據每一個事件的 FIFO 規則來捨棄之前,所要保留之每一個類型的事件數目。

這是選擇性的值。

要使用的 FIFO 模式,如果設定為大於 0 的值,則為要保留在緩衝區內之每一個類型的慣用事件數目。

下列範例說明信號緩衝區目標輸出。

<RingBufferTarget eventsPerSec="" processingTime="" totalEventsProcessed="" eventCount="" droppedCount="" memoryUsed="">
 <event name="" package="" id="" version="" timestamp="">
    <data name="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </data>
    <action name="" package="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </action>
  </event>
</RingBufferTarget>