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 MyView
jest 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 WHERE
klauzuli.
UNION ALL
. O wiele łatwiej jest korzystać z widoku, niż trzeba przepisać zapytanie UNION, gdy tylko potrzebuję danych.Odpowiedzi:
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.źródło
where
klauzulą poza widokiem trwa o wiele dłużej niż kiedy jest wstawiane do widoku?Oto tylko krótki przykład pokazujący, że nie powinno być różnicy. Baza danych jest
AdventureWorks
bazą danych.Dwie definicje widoku:
Oto pierwsze zapytanie z
WHERE
klauzulą zawartą w definicji widoku:Oto plan wykonania:
I drugie zapytanie, z
WHERE
klauzulą nie w definicji widoku, ale wSELECT
zapytaniu:Oto plan wykonania:
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).
źródło
where
klauzulą poza widokiem trwa o wiele dłużej niż kiedy jest wstawiane do widoku?Where
klauzula pasuje doPARTITION BY
. Wydaje się, że SQL Server 2008 ma nową regułęSelOnSeqPrj
rozpoznawania tego konkretnego przypadku.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,
gdzie
MyView
jest zdefiniowane jakopowinien wygenerować ten sam plan wykonania co
ale ten plan wykonania może różnić się od tego, co zostanie wygenerowane
Nie jestem pewien, czy ta odpowiedź byłaby taka sama dla widoków indeksowanych
źródło
sp_refreshview
potrzebna jest koncepcja zastępowania tekstu.