Sql-Server

SQLServer 查詢儲存不保存 SP_ExecuteSQL 執行的失敗查詢

  • October 16, 2020

我們在 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 程式碼來執行以下場景:

  1. 執行正常的成功查詢
  2. 執行出錯的查詢(在這種情況下,它是除以零)
  3. 執行一個返回數百萬行的查詢,然後在所有結果用完之前取消客戶端
  4. 執行一個返回數百萬行的查詢,然後在所有結果用完之前關閉連接
  5. 執行被阻塞的查詢,並遇到伺服器端鎖定超時

以下是擴展事件“rpc_completed”事件中發生的方式:

擴展事件輸出的螢幕截圖,顯示兩個 ok 和三個 aborts

我在每個查詢中嵌入了註釋,/* 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.

如果您可以詳細說明:

  • 您的查詢儲存設置(可能沒有記錄遇到超時的查詢)
  • 查詢經歷的具體超時類型(客戶端連接或命令超時、鎖定超時等)
  • 您用來辨識超時的擴展事件

然後,您可能可以獲得更多幫助來跟踪此問題。

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