2017-05-04 184 views
0

請在我身上輕鬆一下,因爲這是我的第一篇文章。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

回答

0

我想嘗試的東西在這個順序: 1)更新統計 2)重建索引 3)驗證機器的可用內存是不是在壓力下。 4)檢查某種類型的活動或鎖(sp_lock的)

+0

我不需要在這些視圖上的索引能夠更新他們的統計數據?我也無法從那個角度看到信息來自哪裏。 – dgoodman

0

試試這個的,

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