Sql-Server
如何衡量 SQL Server 拒絕錯誤的查詢的影響?
在 2020 年 11 月 23 日配置 XE 以擷取一些錯誤後,我可以統計 2,163,665 次來自舊版應用程序請求的相同錯誤(可能不會很快得到糾正)。這些錯誤可以在處理 SQL 語句的第一步和第二步進行分類:
- DBMS 首先解析 SQL 語句。它將語句分解成單獨的單詞,稱為標記,確保語句具有有效的動詞和有效的子句,等等。在此步驟中可以檢測到語法錯誤和拼寫錯誤。
- 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;