Sql-Server
SQLServer 查詢儲存不保存 SP_ExecuteSQL 執行的失敗查詢
我們在 SQL Server 2016 上
查詢儲存在相關數據庫上被啟動。
我們在每晚的批處理作業中報告了一些超時問題,並且我們已經找到了有問題的查詢。
查詢來自某個框架生成的 .Net 應用程序
我還在查詢儲存中找到了該查詢。但如果我使用“跟踪查詢”,所有執行都報告為良好,沒有超時(也沒有錯誤)
如果我在 QueryStore 中查詢特定的 queryID,所有執行的結果都是“正常”
如果我設置一個擴展事件會話來擷取超時,查詢的超時確實被收集,我可以看到查詢的實際呼叫是通過
EXEC SP_EXECUTESQL N'querystring'
無論結果如何,這是否會以某種方式欺騙查詢儲存區認為它是可以的?
問候
彼得
無論結果如何,這是否會以某種方式欺騙查詢儲存區認為它是可以的?
執行的查詢
sys.sp_executesql
絕對可以在查詢儲存中記錄為“中止”或“異常”。這是一個小複製品。首先,我使用不切實際的查詢儲存設置創建了一個數據庫:USE [master]; GO DROP DATABASE IF EXISTS [278067]; GO CREATE DATABASE [278067]; ALTER DATABASE [278067] SET QUERY_STORE = ON; ALTER DATABASE [278067] SET QUERY_STORE ( OPERATION_MODE = READ_WRITE, DATA_FLUSH_INTERVAL_SECONDS = 30, INTERVAL_LENGTH_MINUTES = 1 ); GO USE [278067]; GO
然後我執行了一些 .NET 程式碼來執行以下場景:
- 執行正常的成功查詢
- 執行出錯的查詢(在這種情況下,它是除以零)
- 執行一個返回數百萬行的查詢,然後在所有結果用完之前取消客戶端
- 執行一個返回數百萬行的查詢,然後在所有結果用完之前關閉連接
- 執行被阻塞的查詢,並遇到伺服器端鎖定超時
以下是擴展事件“rpc_completed”事件中發生的方式:
我在每個查詢中嵌入了註釋,
/* Track Me */
以便可以在查詢儲存中找到它們:SELECT qsrs.execution_type, qsrs.execution_type_desc, qsrsi.start_time, qsrsi.end_time, qsqt.query_sql_text, qsp.query_plan FROM sys.query_store_plan qsp INNER JOIN sys.query_store_query qsq ON qsp.query_id = qsq.query_id INNER JOIN sys.query_store_query_text qsqt ON qsqt.query_text_id = qsq.query_text_id INNER JOIN sys.query_store_runtime_stats qsrs ON qsrs.plan_id = qsp.plan_id INNER JOIN sys.query_store_runtime_stats_interval qsrsi ON qsrsi.runtime_stats_interval_id = qsrs.runtime_stats_interval_id WHERE qsqt.query_sql_text LIKE '%Track Me%' AND qsqt.query_sql_text NOT LIKE '%sys.query_store_plan%';
正如預期的那樣,我們看到了 Regular、Exception,然後是三個 Aborted 查詢。
也就是說,我認為應用程序使用
sys.sp_executesql
.如果您可以詳細說明:
- 您的查詢儲存設置(可能沒有記錄遇到超時的查詢)
- 查詢經歷的具體超時類型(客戶端連接或命令超時、鎖定超時等)
- 您用來辨識超時的擴展事件
然後,您可能可以獲得更多幫助來跟踪此問題。