2013-09-26 46 views
0

我有一個運行SQL查詢的.NET客戶端應用程序,並且該查詢偶爾會被ADO.NET超時。當它超時時,我看不到在dm_exec_query_stats中緩存的查詢計劃。如果查詢完成,則計劃被緩存爲SQL Server查詢計劃緩存和編程檢索

在我的應用程序異常處理程序中,我想以編程方式捕獲超時的特定類查詢的查詢計劃 - 這將幫助我排除故障。這可能嗎?由於每個可能的超時查詢引用具有唯一名稱的表,我可以掃描查詢文本以查找適當的計劃。

我希望,在我的異常處理程序,才能夠運行:

SELECT TOP 1 p.query_plan, t.text 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_sql_text (qs.plan_handle) AS t 
CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) AS p 
WHERE t.text LIKE '%UNIQUETABLE%' 
ORDER BY last_execution_time DESC; 

但這並不包含我正在尋找查詢 - 大概是因爲它是超時?

是否有可能檢索用於啓動查詢然後中止的查詢計劃?

(正在執行的SQL是動態的;!生活會與存儲過程更容易,但可悲的是,這不是用)

+2

也許統計信息生成超時,以至於無法生成計劃。 – usr

+0

可能會增加命令超時將解決您的問題。並且在應用程序中,異步撥打電話。我完全瞭解構建動態查詢。然而,你可以重新格式化它在你的代碼中編譯的方式。 –

+0

順便說一句,你可以通過分析所有語句執行的事件來測試我的理論。統計生成表現爲一種奇怪的內部查詢。 – usr

回答

1

是您的數據庫可能用於特設工作負載而優化?

sp_CONFIGURE 'optimize for ad hoc workloads' 
+0

好主意 - 但我打開了高級選項並看了一下,但事實並非如此。我有一種感覺,如果給定查詢的第一次執行被中止,SQL Server不會寫入一個緩存計劃。但Books Online在這個問題上沒有提供信息。 – pattermeister