我需要找到不仅使用某个表,而且使用表中特定列的所有视图和存储过程。
以下“似乎”有效,但有许多警告要小心使用此方法(由于各种原因不可靠,很快将被弃用等):
SELECT object_name(so.id) TableName, sc.name ColumnName, OBJECT_NAME(sd.id) DependentObjectName,
(SELECT xtype FROM sysobjects so WHERE so.id = sd.id) Object_Type
FROM sysobjects so INNER JOIN syscolumns sc
ON so.id = sc.id
INNER JOIN sysdepends sd
ON so.id = sd.depid and sc.colid = sd.depnumber
WHERE
object_name(so.id) = 'MyTableName'
AND sc.name = 'MyColumnName'
order by object_name(so.id), Object_Type
Run Code Online (Sandbox Code Playgroud)
一些经常被引用的替代方法是 sys.sql_dependencies 和 sys.sql_expression_dependencies,但它们都没有列级粒度。
有谁知道这样做的方法?(或者,即使您明确知道它实际上无法完成,知道它也会有所帮助。)
我今天在一个应用程序中遇到了一组存储过程,它们在长时间运行的进程中被重复调用。在每个过程中,我发现了多个不同的 select 语句,其中一些在循环中;毫不奇怪,当前使用的这些例程需要几分钟才能运行,而直觉预计它们会在几秒钟内完成。
很明显,在编写这些程序时没有考虑性能,有多个实例只是“不是一个好主意”。
导入数据时处理每一行每行需要 300 毫秒,因此相对较小的导入需要几分钟来处理。
然而,程序中涉及的表格大部分都非常小。我在想,如果所有这些表都完全驻留在内存中,那么通过重写其中的任何一个,也许不会获得那么多。
我试图确定......对于这个明显效率低下的代码,它有多大的实际影响?值得修复吗?
所以问题是:
- 有没有办法确定哪些表完全固定在内存中?
- 有没有办法打开跟踪以监视嵌套存储过程以找到特别昂贵的部分?
注意:这是在 SQL Server 2008 R2 上