Macht es einen Unterschied, ob Sie eine Ansicht innerhalb oder außerhalb der Ansicht filtern?
Gibt es beispielsweise einen Unterschied zwischen diesen beiden Abfragen?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Oder
SELECT Id
FROM MyView
WHERE SomeColumn = 1
Und MyView
ist definiert als
SELECT Id, SomeColumn
FROM MyTable
Und ist die Antwort anders, wenn sich die Quelltabelle auf einem Verbindungsserver befindet?
Ich frage, weil ich eine große Tabelle (44mil Zeilen) zweimal von einem Verbindungsserver abfragen und eine Zusammenfassung der Ergebnisse erhalten muss. Ich möchte wissen, ob ich zwei Ansichten erstellen soll, um auf die Daten zuzugreifen, eine für jede Abfrage, oder ob ich mit einer einzelnen Ansicht und einer WHERE
Klausel davonkommen kann .
UNION ALL
. Es ist viel einfacher, eine Ansicht zu verwenden, als die UNION-Abfrage jedes Mal neu schreiben zu müssen, wenn ich die Daten benötige.Antworten:
Sie sollten absolut keinen Unterschied in den Plänen oder der Leistung zwischen diesen beiden Optionen sehen. Wenn die Ansicht abgefragt wird, wird sie zu einer Abfrage für die Basistabelle erweitert, was bedeutet, dass derselbe Such- oder Scanvorgang verwendet wird.
Abhängig vom Datentyp und der Selektivität von erhalten
MyColumn
Sie möglicherweise eine bessere Leistung, wenn Sie einen gefilterten Index für die Basistabelle erstellen möchten (wenn Sie zu SQL Server 2008+ wechseln). Dies wird jedoch in der Ansicht nicht anders sein oder ohne.quelle
where
Klausel außerhalb der Ansicht so viel länger dauert, als wenn sie in die Ansicht gestellt wird?Hier ist nur ein kurzes Beispiel, das zeigt, dass es keinen Unterschied geben sollte. Die Datenbank ist die
AdventureWorks
Datenbank.Zwei Ansichtsdefinitionen:
Hier wäre die erste Abfrage mit der
WHERE
Klausel, die in der Sichtdefinition enthalten ist:Hier ist der Ausführungsplan:
Und die zweite Abfrage mit der
WHERE
Klausel nicht in der Sichtdefinition, sondern in derSELECT
Abfrage:Hier ist der Ausführungsplan:
Wie Sie aus diesen Ausführungsplänen ersehen können, sind sie identisch mit identischen Ergebnissen. Ich kenne keine Situation, in der diese Art von Logik / Design zu unterschiedlichen Ergebnissen führen würde. Ich würde also gerne sagen, dass Sie in beiden Fällen in Sicherheit sind und Ihre persönlichen Vorlieben (oder Geschäftsprozesse) berücksichtigen.
quelle
where
Klausel außerhalb der Ansicht so viel länger dauert, als wenn sie in die Ansicht gestellt wird?Where
Klausel mit der übereinstimmtPARTITION BY
. SQL Server 2008 scheint eine neue RegelSelOnSeqPrj
zu haben, um diesen speziellen Fall zu erkennen.Basierend auf dem, was ich lese , verwendet SQL eine Standardansicht wie eine Unterabfrage, um den Ausführungsplan zu bestimmen.
Also mit meiner Beispielabfrage,
wo
MyView
ist definiert alsEs sollte den gleichen Ausführungsplan wie generieren
Dieser Ausführungsplan kann sich jedoch von dem unterscheiden, mit dem er generiert wird
Ich bin nicht sicher, ob diese Antwort für indizierte Ansichten gleich wäre
quelle
sp_refreshview
es nötig ist, was das Konzept der Textsubstitution nicht würde.