Czy widoki są zoptymalizowane, gdy dodam do nich klauzulę WHERE?

28

Czy to robi różnicę, jeśli filtrujesz Widok wewnątrz lub na zewnątrz Widoku?

Na przykład, czy jest jakaś różnica między tymi dwoma zapytaniami?

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Lub

SELECT Id
FROM MyView
WHERE SomeColumn = 1

I MyViewjest zdefiniowany jako

SELECT Id, SomeColumn
FROM MyTable

Czy odpowiedź jest inna, jeśli tabela źródłowa znajduje się na serwerze połączonym?

Pytam, ponieważ muszę dwukrotnie wysłać zapytanie do dużej tabeli (wiersze 44 mil) z połączonego serwera i uzyskać agregację wyników. Chcę wiedzieć, czy powinienem utworzyć dwa widoki, aby uzyskać dostęp do danych, po jednym dla każdego zapytania, czy też mogę uciec od jednego widoku i WHEREklauzuli.

Rachel
źródło
1
dlaczego miałbyś w ogóle korzystać z widoku, jeśli masz tylko jeden stół?
HLGEM
3
Bezpieczeństwo @HLGEM?
JNK,
2
@HLGEM Widok zawiera wiele zapytań do wielu baz danych na różnych serwerach i łączy je wszystkie za pomocą UNION ALL. O wiele łatwiej jest korzystać z widoku, niż trzeba przepisać zapytanie UNION, gdy tylko potrzebuję danych.
Rachel
1
@datagod Będę o tym pamiętać, dziękuję :) W tym przypadku istnieje dość mała aplikacja, która zbiera dane z wielu serwerów, uruchamia obliczenia i wyrzuca mnóstwo raportów. Ma własną bazę danych, ponieważ niektóre obliczenia wymagają dość dużych zasobów, a ja chciałem ją oddzielić od wszystkiego innego.
Rachel

Odpowiedzi:

12

Nie powinno być absolutnie żadnej różnicy w planach ani wydajności między tymi dwoma opcjami. Gdy widok jest zapytany, zostaje rozwinięty do zapytania dotyczącego tabeli podstawowej, co oznacza, że ​​zostanie użyte to samo wyszukiwanie lub skanowanie.

Teraz, w zależności od typu danych i selektywności MyColumn, jeśli chcesz utworzyć filtrowany indeks w tabeli podstawowej (po przejściu na SQL Server 2008+), możesz uzyskać lepszą wydajność, ale to również nie będzie się różnić w widoku lub bez.

Aaron Bertrand
źródło
3
Co z tym pytaniem , które pyta, dlaczego zapytanie z whereklauzulą ​​poza widokiem trwa o wiele dłużej niż kiedy jest wstawiane do widoku?
Rachel
1
Jeśli widoki nie dotyczą wydajności, to tylko struktura?
profimedica
1
Widoki indeksowane @profimedica mogą być tworzone ze względu na wydajność (np. do przechowywania wyników pośrednich, takich jak agregaty zamiast obliczania ich w czasie wykonywania). Jeśli widok nie zostanie zmaterializowany, może być z różnych powodów: OSUSZANIE (wspólne łączenie lub filtr wykonywane w wielu różnych zapytaniach), bezpieczeństwo, zaciemnianie, uproszczenie schematu.
Aaron Bertrand
5

Oto tylko krótki przykład pokazujący, że nie powinno być różnicy. Baza danych jest AdventureWorksbazą danych.

Dwie definicje widoku:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

Oto pierwsze zapytanie z WHEREklauzulą ​​zawartą w definicji widoku:

select *
from person.vContactWhere

Oto plan wykonania:

wprowadź opis zdjęcia tutaj

I drugie zapytanie, z WHEREklauzulą ​​nie w definicji widoku, ale w SELECTzapytaniu:

select *
from person.vContactNoWhere
where ContactID = 24

Oto plan wykonania:

wprowadź opis zdjęcia tutaj

Jak widać z tych planów wykonania, są one identyczne z identycznymi wynikami. Nie znam sytuacji, w której ten rodzaj logiki / projektu dałby różne wyniki. Chciałbym więc powiedzieć, że i tak jesteś bezpieczny i postępować zgodnie z osobistymi preferencjami (lub procedurami zakupów).

Thomas Stringer
źródło
1
Co z tym pytaniem , które pyta, dlaczego zapytanie z whereklauzulą ​​poza widokiem trwa o wiele dłużej niż kiedy jest wstawiane do widoku?
Rachel
1
@Rachel Myślę, że gbn wyjaśnił to dość dobrze w swoim poście i artykule, na który wskazał. Nie wiem, jak inaczej to ująć.
Thomas Stringer
Połączyłem to, ponieważ w takim przypadku plany wykonania nie były takie same, co różni się od tego, co mówi twoja odpowiedź.
Rachel
1
@Rachel Problemem w tym przykładzie jest brakująca reguła transformacji . Dotyczy to nie tylko widoków, ale także CTE i innych wyrażeń tabelowych. W ogólnym przypadku przesunięcie predykatu w dół do wyrażeń tabel zawierających funkcje rankingu nie jest poprawne, ponieważ spowoduje to zmianę wyniku. W tym przypadku jest ważny, ponieważ Whereklauzula pasuje do PARTITION BY. Wydaje się, że SQL Server 2008 ma nową regułę SelOnSeqPrjrozpoznawania tego konkretnego przypadku.
Martin Smith
2

W oparciu o to , co czytam , SQL użyje standardowego widoku, takiego jak zapytanie podrzędne, przy określaniu planu wykonania.

Korzystając z mojego przykładowego zapytania,

SELECT Id
FROM MyView
WHERE SomeColumn = 1

gdzie MyViewjest zdefiniowane jako

SELECT Id, SomeColumn
FROM MyTable

powinien wygenerować ten sam plan wykonania co

SELECT Id
FROM 
(
    SELECT Id, SomeColumn
    FROM MyTable
) as T
WHERE SomeColumn = 1

ale ten plan wykonania może różnić się od tego, co zostanie wygenerowane

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Nie jestem pewien, czy ta odpowiedź byłaby taka sama dla widoków indeksowanych

Rachel
źródło
Nie sądzę, że jest to wyraźna zamiana tekstu.
Aaron Bertrand
@AaronBertrand Być może masz rację. Naprawdę nie mam pojęcia ... Uczę się na bieżąco :) To założenie było oparte na innych rzeczach, które czytałem o tym, jak widoki są jak makra. Lekko zredagowałem pytanie, aby sprecyzować, że mam na myśli widoki standardowe, a nie indeksowane.
Rachel
@Rachel - Podstawienie następuje w przypadku drzewa algebrizowanego, które nie ma poziomu tekstowego.
Martin Smith
@MartinSmith Hrrmm nie to powiedziałem? Że plany wykonania powinny być takie same, a nie, że tekst byłby taki sam? Nie jestem pewien, czy rozumiem „algebrized tree”
Rachel
To była odpowiedź na twój komentarz do samego Q, który mówi, że „wstawia tekst Widoku do twojego zapytania” i komentarz Aarona powyżej. Kilka informacji o etapach parsowania / kompilacji tutaj . W rzeczywistości twoja odpowiedź również wspomina o zastępowaniu tekstu. Czy jest to rozróżnienie warte zrobienia. Niepewny! Ale wydaje mi się, że wyjaśnia, dlaczego sp_refreshviewpotrzebna jest koncepcja zastępowania tekstu.
Martin Smith