INFORMATION_SCHEMA查询运行缓慢

问题描述:

请在我身上轻松一下,因为这是我的第一篇文章。INFORMATION_SCHEMA查询运行缓慢

我无法弄清楚在我们的INFORMATION_SCHEMA上运行如此慢的问题将会解决以下问题。据我所知,这些观点非常好。这在SQL Server 2014 Standard上。

最近,我们还原了使用此查询的数据库。该数据库是生产数据库的测试版本。在恢复之前,这个查询在几秒或更少的时间内运行,但现在需要3到5分钟才能返回36行。该查询运行速度明显快于最后一行注释,大约4秒左右,返回60行。

有没有人有什么想法做什么使这个又快又快?

可能会回答几个问题的其他详细信息:查询在生产数据库中也需要这么长时间。这些视图没有任何索引。

SELECT pf.TABLE_CATALOG AS PK_TABLE_DATABASE, 
      pf.TABLE_SCHEMA AS PK_SCHEMA_NAME, 
      pf.TABLE_NAME AS PK_TABLE_NAME, 
      pf.COLUMN_NAME AS PK_FIELD_NAME, 
      ff.TABLE_CATALOG AS FK_TABLE_DATABASE, 
      ff.TABLE_SCHEMA AS FK_SCHEMA_NAME, 
      ff.TABLE_NAME AS FK_TABLE_NAME, 
      ff.COLUMN_NAME AS FK_FIELD_NAME, 
      pf.ORDINAL_POSITION AS ORDINAL 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ff 
    ON rc.CONSTRAINT_NAME = ff.CONSTRAINT_NAME 
    AND rc.CONSTRAINT_SCHEMA = ff.CONSTRAINT_SCHEMA 
    AND rc.CONSTRAINT_CATALOG = ff.CONSTRAINT_CATALOG 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pf 
    ON rc.UNIQUE_CONSTRAINT_NAME = pf.CONSTRAINT_NAME 
    AND rc.UNIQUE_CONSTRAINT_SCHEMA = pf.CONSTRAINT_SCHEMA 
    AND rc.UNIQUE_CONSTRAINT_CATALOG = pf.CONSTRAINT_CATALOG 
    AND ff.ORDINAL_POSITION = pf.ORDINAL_POSITION --line in question 

谢谢你的时间。

+0

我必须失去了一些东西 - 为什么加入'JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE'两次?我没有看到任何区别他们的东西。 –

+0

获取组合中PK和FK的表格和字段信息。 – dgoodman

我想尝试的东西在这个顺序: 1)更新统计 2)重建索引 3)验证机器的可用内存是不是在压力下。 4)检查某种类型的活动或锁(sp_lock的)

+0

我不需要在这些视图上的索引能够更新他们的统计数据?我也无法从那个角度看到信息来自哪里。 – dgoodman

试试这个的,

SELECT pf.TABLE_CATALOG AS PK_TABLE_DATABASE, 
      pf.TABLE_SCHEMA AS PK_SCHEMA_NAME, 
      pf.TABLE_NAME AS PK_TABLE_NAME, 
      pf.COLUMN_NAME AS PK_FIELD_NAME, 
      ff.TABLE_CATALOG AS FK_TABLE_DATABASE, 
      ff.TABLE_SCHEMA AS FK_SCHEMA_NAME, 
      ff.TABLE_NAME AS FK_TABLE_NAME, 
      ff.COLUMN_NAME AS FK_FIELD_NAME, 
      pf.ORDINAL_POSITION AS ORDINAL 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE ff 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pf 
ON ff.ORDINAL_POSITION = pf.ORDINAL_POSITION --line in question 
where exists 
(
select 1 
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
where rc.CONSTRAINT_NAME = ff.CONSTRAINT_NAME 
    AND rc.CONSTRAINT_SCHEMA = ff.CONSTRAINT_SCHEMA 
    AND rc.CONSTRAINT_CATALOG = ff.CONSTRAINT_CATALOG 
    and rc.UNIQUE_CONSTRAINT_NAME = pf.CONSTRAINT_NAME 
    AND rc.UNIQUE_CONSTRAINT_SCHEMA = pf.CONSTRAINT_SCHEMA 
    AND rc.UNIQUE_CONSTRAINT_CATALOG = pf.CONSTRAINT_CATALOG 
) 
+0

Hey KumarHarsh,该查询仍然需要一段时间。与原始查询大致相同。 – dgoodman