Sql-Server

如何衡量 SQL Server 拒絕錯誤的查詢的影響?

  • February 22, 2021

在 2020 年 11 月 23 日配置 XE 以擷取一些錯誤後,我可以統計 2,163,665 次來自舊版應用程序請求的相同錯誤(可能不會很快得到糾正)。這些錯誤可以在處理 SQL 語句的第一步和第二步進行分類:

  1. DBMS 首先解析 SQL 語句。它將語句分解成單獨的單詞,稱為標記,確保語句具有有效的動詞和有效的子句,等等。在此步驟中可以檢測到語法錯誤和拼寫錯誤。
  2. DBMS 驗證該語句。它根據系統目錄檢查語句。語句中命名的所有表是否都存在於數據庫中?是否所有列都存在並且列名是否明確?使用者是否具有執行語句所需的權限?在此步驟中可以檢測到某些語義錯誤。

該文件還說,解析 SQL 語句不需要訪問數據庫並且可以非常快速地完成,但是在伺服器上發出的請求數量讓我覺得我應該驗證一下。

我想衡量那些在這些步驟中被拒絕的錯誤請求對資源消耗的影響。有沒有辦法這樣做?

我從您的評論中看到,錯誤發生的頻率並不高,以至於成為性能問題。

要回答所提出的問題,您可以創建一個過濾的 XE 跟踪來擷取詳細的 sql_batch_completed 和 rpc_completed 事件,其中結果是錯誤。然後可以通過聚合統計數據的時間間隔來匯總事件。

下面的範例總結了從跟踪文件目標按一分鐘間隔進行的 CPU 和邏輯讀取。

--example trace
CREATE EVENT SESSION [errors] ON SERVER 
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
   WHERE ([result]=(1))),
ADD EVENT sqlserver.sql_batch_completed(
   WHERE ([result]=(1)))
ADD TARGET package0.event_file(SET filename=N'C:\TraceFiles\errors',max_rollover_files=(2))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF);
GO

--example aggregation query
WITH
   event_data AS (
       SELECT CAST(event_data AS XML) AS event_data_xml
       FROM fn_xe_file_target_read_file('C:\TraceFiles\errors*.xel',NULL,NULL,NULL)
   )
   , event_data_fields AS (
       SELECT 
             DATEADD(minute,DATEDIFF(minute,'',event_data_xml.value('(/event/@timestamp)[1]', 'datetime2')),'') AS interval
           , event_data_xml.value('(/event/data[@name="duration"]/value)[1]', 'bigint') AS duration
           , event_data_xml.value('(/event/data[@name="cpu_time"]/value)[1]', 'bigint') AS cpu_time
           , event_data_xml.value('(/event/data[@name="logical_reads"]/value)[1]', 'bigint') AS logical_reads
       FROM event_data
   )
SELECT
     interval
   , SUM(duration) AS duration
   , SUM(cpu_time) AS cpu_time
   , SUM(logical_reads) AS logical_reads
FROM event_data_fields
GROUP BY interval
ORDER BY interval;

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