2017-07-18 6 views
0

vw_project ist eine Ansicht, die 20 CTEs beinhaltet, so dass sie mehrmals kommen und 56 SpaltenSQL Server-Abfrage-Verhalten

zurückkehren viele dieser CTEs sind selbst verbindet (die klassische „letzte Zeile pro Gruppe“, die wir in unserem Fall Holen Sie sich das letzte verwandte Objekt Produkt/Kunde/Manager pro Projekt)

Die meisten der Tabellen (möglicherweise 40?) überschreiten nicht 1000 Zeilen, die Ansicht selbst gibt 634 Zeilen zurück.

Wir versuchen, die sehr schlechten Leistungen dieser Ansicht zu verbessern. Wir haben denormalisiert (von TPT zu TPH) und die Anzahl der Joins fast ohne Auswirkung halbiert.

Aber ich verstehe nicht, die folgenden Ergebnisse Ich bin zu erhalten:

select * from vw_Project (TPT) 
2 sec 

select * from vw_Project (TPH) 
2 sec 

select Id from vw_Project (TPH , TPT is instant) 
6 sec 

select 1 from vw_Project (TPH , TPT is instant) 
6 sec 

select count(1) from vw_Project (TPH , TPT is instant) 
6 sec 

Ausführungsplan für den letzten (6 sec): https://www.brentozar.com/pastetheplan/?id=r1DqRciBW

Ausführungsplan nach sp_updatestats https://www.brentozar.com/pastetheplan/?id=H1Cuwsor-

Das klingt absurd, ich verstehe nicht, was passiert und es ist schwer zu wissen, ob meine Optimierungsstrategien relevant sind, da ich keine ID habe was rechtfertigt das anscheinend irrationale Verhalten, das ich beobachte ...

Irgendwelche Anhaltspunkte?

+2

Haben Sie einen Ausführungsplan, den Sie mit uns teilen können? – WJS

+2

Sie könnten versuchen, den Plan einer dieser Auswahlen (z. B. die 6 Sek.) [Hier] (https://www.brentozar.com/pastetheplan/) einzufügen, damit jeder sie sehen kann. –

+0

Was ist TPT und TPH? –

Antwort

1

CTE hat keine Garantie für die Ausführung der Anweisungen und 20 CTEs sind meiner Meinung nach viel zu viele. Sie können OPTION (FORCE ORDER) verwenden, um die Ausführung von oben nach unten zu erzwingen.

Für die Auswahl von ein paar Tausend Zeilen ist jedoch mehr als 1 Sekunde unabhängig von der Komplexität nicht akzeptabel. Ich würde einen Ansatz einer Tabellenfunktion wählen, so dass ich den Luxus hätte, Hashtabellen oder Tabellenvariablen zu erstellen, um die volle Kontrolle über jeden Schritt zu haben. Auf diese Weise begrenzen Sie den Optimierungsbereich innerhalb jedes einzelnen Schritts.

+0

OPTION (KRAFTORDNUNG) kleinere invertierte Ergebnisse (6s werden 2s und 2s werden 6s) – Proviste

+0

Interessant. FORCE ORDER wird nicht alleine arbeiten - es muss eine logische Reihenfolge von CTEs geben wie WITH A, B, C ... wo B A verwendet und C B verwendet und so weiter. Wenn Top-CTEs Daten gut filtern, werden niedrigere CTEs mit weniger Daten besser. Versuchen Sie also, die Reihenfolge zu ändern - setzen Sie gute Filter-CTEs so hoch wie möglich. –