2017-05-04 3 views
0

Bitte gehen Sie einfach auf mich als dies ist mein erster Beitrag.INFORMATION_SCHEMA Abfrage läuft langsam

Ich habe Probleme herauszufinden, was die folgende Abfrage auf unserer INFORMATION_SCHEMA von so langsam ausgeführt beheben wird. Soweit ich weiß, sind diese Ansichten ziemlich gut abgesichert. Dies ist auf SQL Server 2014 Standard.

Kürzlich haben wir die Datenbank wiederhergestellt, auf der diese Abfrage verwendet wurde. Diese Datenbank ist die Testversion einer Produktionsdatenbank. Vor dieser Wiederherstellung lief diese Abfrage in wenigen Sekunden oder weniger, aber jetzt dauert es 3-5 + Minuten, um 36 Zeilen zurückzugeben. Diese Abfrage wird deutlich schneller ausgeführt, wobei die letzte Zeile in etwa 4 Sekunden auskommentiert wird und 60 Zeilen zurückgegeben werden.

Hat jemand irgendwelche Ideen, was zu tun ist, um es wieder schnell zu machen?

Weitere Details, die noch einige Fragen beantworten können: Die Abfrage dauert so lange in der Produktionsdatenbank. Es gibt keine Indizes für die Ansichten.

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 

Vielen Dank für Ihre Zeit.

+0

ich etwas fehlen darf - warum kommen Sie 'JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE' zweimal? Ich sehe nichts, was sie unterscheidet. –

+0

Um die Tabellen- und Feldinformationen für PK und FK in der Kombination zu erhalten. – dgoodman

Antwort

0

Ich würde versuchen, die Dinge in dieser Reihenfolge: 1) Aktualisieren Sie die Statistiken 2) Indizes neu erstellen 3) Überprüfen Sie den Speicher in der Maschine verfügbar ist nicht unter Druck. 4) prüfen für irgendeine Art von Aktivität oder Schlösser (sp_lock)

+0

Benötige ich keinen Index für diese Ansichten, um Statistiken zu diesen Ansichten zu aktualisieren? Ich bin nicht in der Lage zu sehen, wo diese Informationen auch in dieser Ansicht herkommen. – dgoodman

0

Try this,

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, diese Abfrage dauert noch eine ganze Weile. Etwa genauso wie die ursprüngliche Abfrage. – dgoodman