是否有任何用於捕獲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
執行時間依賴性會SomeTable
,sp_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的確定性結果集的長期運行的程序。基礎數據相當靜態。如果我可以在執行時收集實際的依賴關係,我可以自動將緩存中的條目與一組對象相關聯。如果任何這些對象改變了,我會知道哪些條目無效。
這可能是一個糟糕的緩存策略,我不知道。但是依賴技術在其他情況下仍然有用。
有什麼想法?非常感謝。
你想覆蓋SQL Server自己的緩存嗎? – gbn 2010-08-21 05:38:47
我正試圖緩存/記憶長時間運行的程序的確定性結果集。我不相信SQL Server維護這樣的緩存。沒有? – 2010-08-21 06:03:56