2010-08-21 63 views
3

是否有任何用於捕獲SQL Server中執行時對象依賴關係的方法?在SQL Server中執行時捕獲對象依賴關係

舉例來說,採取這種動態SQL情景:

DECLARE @table SYSNAME = 'SomeTable' 
DECLARE @column SYSNAME = 'SomeColumn' 
DECLARE @proc SYSNAME 
DECLARE @command NVARCHAR(MAX) = 'SELECT TOP 1 @proc = '[email protected]+' FROM '[email protected] 
EXEC sp_executesql @command, N'@proc SYSNAME OUTPUT', @proc OUTPUT 
EXEC @proc 

執行時間依賴性會SomeTablesp_executesql@proc的價值,不管對象是由在運行時引用@ proc程序。

方法我已經考慮迄今:

  • 抓住從sys.dm_exec_query_plan兩個XML查詢計劃從每個批次內,並且經由服務中介其傳遞到另一個進程進行處理。優點:我認爲它可能確實有效。缺點:潛在的昂貴和侵入性:每個批次和執行級別都必須進行改進以捕獲查詢計劃。

  • 擴展事件。優點:如果它可以工作,那麼太棒了!缺點:我不認爲這是對「對象訪問」合適的事件類,如掃描和/或尋求和/或EXEC等等等等

理想的情況下,捕獲會工作是這樣的:

DECLARE @guid UNIQUEIDENTIFIER 
EXEC usp_begin_object_capture @guid OUTPUT 

DECLARE @table SYSNAME = 'SomeTable' 
DECLARE @column SYSNAME = 'SomeColumn' 
DECLARE @proc SYSNAME 
DECLARE @command NVARCHAR(MAX) = 'SELECT TOP 1 @proc = '[email protected]+' FROM '[email protected] 
EXEC sp_executesql @command, N'@proc SYSNAME OUTPUT', @proc OUTPUT 
EXEC @proc 

EXEC usp_stop_object_capture @guid 

SELECT object_name FROM object_capture_table WHERE guid = @guid 

------------------------------ 
object_name 
------------------------------ 
SomeTable 
sp_executesql 
<[email protected]> 
<[email protected]> 
<[email protected]> 
<[email protected]> 
<[email protected]> 

語境:

我想緩存/ memoize的確定性結果集的長期運行的程序。基礎數據相當靜態。如果我可以在執行時收集實際的依賴關係,我可以自動將緩存中的條目與一組對象相關聯。如果任何這些對象改變了,我會知道哪些條目無效。

這可能是一個糟糕的緩存策略,我不知道。但是依賴技術在其他情況下仍然有用。

有什麼想法?非常感謝。

+2

你想覆蓋SQL Server自己的緩存嗎? – gbn 2010-08-21 05:38:47

+0

我正試圖緩存/記憶長時間運行的程序的確定性結果集。我不相信SQL Server維護這樣的緩存。沒有? – 2010-08-21 06:03:56

回答

0

[回答我的問題....]

見sp_trace%的系統特效,開始瓦特/ sp_trace_create

使用事件114「審計模式對象訪問事件」。

包括列DatabaseName,ParentNameObjectName,也許ServerName

第12列的過濾器,SPID

擴展事件不公開模式對象訪問事件(尚未),否則可能會更好。

2

如何利用SQL Server內置緩存失效機制,即Query Notifications?您緩存/記憶您的查詢結果,並讓SQL Server在結果發生變化時通知您。

+0

有兩個問題:a)這甚至可能來自SQL Server內部嗎? BOL聲稱您無法訂閱服務器內部的查詢通知(http://msdn.microsoft.com/zh-cn/library/ms188669.aspx)。 b)EXECUTE語句的查詢通知是否在執行時收集其依賴項,對於每個嵌套批處理進行編譯? SELECT語句有許多限制。它們如何轉換爲文檔中的EXECUTE語句並不明顯,但AFAIK甚至不允許流控制(http://msdn.microsoft.com/zh-cn/library/ms181122.aspx)。 謝謝你的鏈接。 – 2010-08-21 17:48:55

+0

恐怕這跟保存緩存結果一樣好。對於在執行T-SQL代碼段期間跟蹤對象引用的東西,您應該考慮設置XEvents會話。基於跟蹤對象引用是否有可能存在保存和正確的緩存失效,這仍然有待觀察,但如果將它取消,這將是相當大的優勢。 – 2010-08-21 23:51:41

+0

我去了old-skool,w/sp_trace%。現在我有運行時依賴關係。途中有一半! – 2010-08-24 00:44:31