是否有任何用于捕获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