2010-08-21 32 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