2010-10-22 13 views
27

Sollte eine ziemlich direkte Frage sein. Kann ich einem allgemeinen Tabellenausdruck (Common Table Expression, CTE) einen INDEX hinzufügen?Hinzufügen eines INDEX zu einem CTE

+4

Es könnte irgendwie möglich sein mit einigen Unordnung mit Plan Führer. [Dieser Artikel] (http://explainextended.com/2009/05/28/generating-xml-in-subqueries/) von [Quassnoi] (http://Stackoverflow.com/users/55159/quassnoi) zeigt, wie es geht Verwenden Sie einen Planhinweis, um die Ergebnisse eines CTE zwischenzuspeichern, indem Sie dem Plan einen EagerSpool hinzufügen. Dies erstellt einen temporären Index über sie in Tempdb. –

+1

@Martin Smith: WOW !!! Ich werde eine gute Lektüre davon haben und versuchen, meinen Kopf um alles zu bekommen :) –

Antwort

18

Nr

WAK ist eine temporäre, „inline“ Ansicht - Sie keinen Index auf ein solches Konstrukt hinzufügen können.

Wenn Sie einen Index benötigen, erstellen Sie eine reguläre Ansicht mit dem SELECT Ihres CTE und machen Sie eine indizierte Sicht (indem Sie der Ansicht einen gruppierten Index hinzufügen). Sie müssen die folgenden Regeln befolgen: Creating an Indexed View.

+1

Danke. Ich war mir nicht sicher, ob Bing-ing nichts zeigte und auch nicht Googl-ing. –

+10

Was ist mit Lycos-ing? –

+1

Für mich dauerte die indizierte Ansicht 18 Sekunden, dann 16 Sekunden und dann 14 Sekunden. CTE brauchte 16 Sekunden ersten Versuch. Ich bleibe bei CTE. BTW, für mich indizierte Tabelle (vorübergehend verwendet) war am besten bis zu 10 Sekunden insgesamt. – Todd

48

Ich hatte die gleiche Anforderung. Indizes können keinem CTE hinzugefügt werden. Im CTE-Format wurde jedoch durch Hinzufügen einer ORDER BY-Klausel für die verbundenen Felder die Ausführungszeit von 20 Minuten oder mehr auf unter 10 Sekunden reduziert.

(Sie müssen auch SELECT TOP 100 PROZENT ADD ORDER BY in einem WAK wählen zu können.)

[Bearbeiten von einem Kommentar unter paraphrasiert Zitat hinzufügen]:
Wenn Sie DISTINCT haben in der CTE dann TOP 100 PROZENT funktioniert nicht. Diese cheater Methode ist immer verfügbar: ohne TOP überhaupt in der Auswahl zu benötigen, die ORDER BY-Anweisung ändern zu lesen:
ORDER BY [Blah] OFFSET 0 rows

+2

Wo hast du solchen Voodoo gelernt? Es hat eine bemerkenswerte Wirkung auf eine lange laufende Abfrage, die wir hatten. Top 100000 funktioniert besser als Top 100 PROZENT. Ich werde anfangen, in den Abfrage-Analysator zu graben, um zu sehen, was vor sich geht. Vielen Dank! – BlackjacketMack

+0

Das ist sehr interessant und gut zu wissen. Ich änderte meine Anfrage von Top 1000000 zu Top 100 PROZENT. Ich werde es zurück ändern. Ich bin mit diesem Hinweis auf Post auf MSDN gestoßen, als ich versuchte, einen CTE für die Perforance zu indizieren. –

+0

TOP 100 PROZENT verwendet möglicherweise die Anzahl der geschätzten Datensätze, die zurückgegeben werden sollen. TOP 1000000 könnte denken, dass es mehr geben wird, und mehr Speicher für die Ausführung reservieren, so dass es keine Warnmeldungen und Überlaufe für TempDB gibt. – milivojeviCH

0

@BH - Um das DISTINCT Problem bekommen mit TOP mit 100% oder TOP 1000000, könnten Sie immer GROUP BY verwenden. Dient dem gleichen Zweck und ist manchmal schneller als DISTINCT.

Verwandte Themen