ich habe eine Abfrage wie folgt auszuführen:Wie kann ich zwingen SQL Server subquery erste und filtern das ‚wo‘ Anweisung
select * from (
select * from TableX
where col1 % 2 = 0
) subquery
where col1 % 4 = 0
Die tatsächliche Unterabfrage ist komplizierter. wenn ich die Unterabfrage allein ausführe, gibt es vielleicht 200 Zeilen schnell zurück, aber wenn ich die ganze Abfrage ausführe, dauert es zu lange, bis ich darauf warten muss.
Ich weiß SQL-Server nimmt einige Optimierung hier und fügen Sie die where
-Anweisung in die Unterabfrage, und erstellen Sie den neuen Ausführungsplan, der nicht so effizient ist. Trotzdem kann ich in den Ausführungsplan eintauchen und analysieren, warum, wie der Index fehlt, die Statistik veraltet ist.
Aber ich weiß sicher, dass meine Unterabfrage, die als BaseTable dient, nur einen kleinen Teil der Daten zurückgibt, so dass ich alle weiteren Filterung oder Verbindung nur in diesen kleinen Teil der Daten stattfinden soll.
Meine Frage ist, kann ich SQL Server zwingen, die Unterabfrage zuerst auszuführen, ohne sich um die äußere where
Aussage zu kümmern? (Btw, TempTable ist meine letzte Option, CTE funktioniert nicht)
Was ist mit einer temporären Tabelle? – fnurglewitz
Was ist mit Ihnen zu erklären, das eigentliche Problem - nicht erzwingen, aber überprüfen Sie den Ausführungsplan und schauen Sie, warum SQL Server denkt, dass es so klüger ist. Bist du vollständig gepatcht? Einige Probleme waren im Apst mit Abfrageoptimierer - lange in der Vergangenheit, aber einige Leute verwenden immer noch SQL Server 2005. – TomTom
@TomTom Diese Prädikate sind nicht darstellbar, so dass es sehr wahrscheinlich ist, dass die Optimiererschätzungen aus sind. Es kann keine Statistiken verwenden und muss nur raten. Vielleicht hilft das Erstellen von Statistiken für eine berechnete Spalte. –