Macht es einen Unterschied, ob Sie eine Ansicht innerhalb oder außerhalb der Ansicht filtern?
Gibt es zum Beispiel 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 (44-mil-Zeilen) zweimal von einem Verbindungsserver abfragen muss, um eine Zusammenfassung der Ergebnisse zu erhalten. 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.
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 dieselbe Suche oder derselben Scan verwendet wird.
Abhängig vom Datentyp und der Selektivität von MyColumn
können Sie möglicherweise eine bessere Leistung erzielen, wenn Sie einen gefilterten Index für die Basistabelle erstellen möchten (wenn Sie zu SQL Server 2008+ wechseln) nicht anders sein über die Ansicht oder ohne.
Hier ist nur ein kurzes Beispiel, das zeigt, dass es keinen Unterschied geben sollte. Die Datenbank ist die AdventureWorks
Datenbank.
Zwei View-Definitionen:
create view Person.vContactWhere
as
select *
from person.Contact
where ContactID = 24
go
create view Person.vContactNoWhere
as
select *
from person.Contact
go
Hier wäre die erste Abfrage mit der Klausel WHERE
in der Ansichtsdefinition:
select *
from person.vContactWhere
Hier ist der Ausführungsplan:
Und die zweite Abfrage mit der Klausel WHERE
nicht in der Ansichtsdefinition, sondern in der Abfrage SELECT
:
select *
from person.vContactNoWhere
where ContactID = 24
Hier ist dieser Ausführungsplan:
Wie Sie diesen Ausführungsplänen entnehmen können, sind sie mit identischen Ergebnissen identisch. 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 sicher sind und persönliche Vorlieben (oder Geschäftsabläufe) haben.
Basierend auf wasich binLesen verwendet SQL bei der Bestimmung des Ausführungsplans eine Standardansicht wie eine Unterabfrage.
Verwenden Sie also meine Beispielabfrage.
SELECT Id
FROM MyView
WHERE SomeColumn = 1
dabei ist MyView
definiert als
SELECT Id, SomeColumn
FROM MyTable
es sollte den gleichen Ausführungsplan wie generieren
SELECT Id
FROM
(
SELECT Id, SomeColumn
FROM MyTable
) as T
WHERE SomeColumn = 1
dieser Ausführungsplan kann sich jedoch von dem unterscheiden, mit dem generiert wird
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Ich bin nicht sicher, ob diese Antwort für indizierte Ansichten dieselbe wäre