it-swarm.com.de

Werden Ansichten optimiert, wenn ich ihnen eine WHERE-Klausel hinzufüge?

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.

30
Rachel

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.

14
Aaron Bertrand

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:

enter image description here

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:

enter image description here

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.

6
Thomas Stringer

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

2
Rachel