Tak , do widoków można przypisać indeks klastrowy, a kiedy to zrobią, będą przechowywać tymczasowe wyniki, które mogą przyspieszyć wynikowe zapytania.
Aktualizacja: co najmniej trzy osoby zagłosowały za mną w tej sprawie. Z całym szacunkiem uważam, że są po prostu w błędzie; Własna dokumentacja Microsoft wyraźnie pokazuje, że Widoki mogą poprawić wydajność.
Po pierwsze, proste widoki są rozbudowywane i nie przyczyniają się bezpośrednio do poprawy wydajności - to prawda. Jednak indeksowane widoki mogą znacznie poprawić wydajność.
Pozwól mi przejść bezpośrednio do dokumentacji:
Po utworzeniu unikatowego indeksu klastrowego w widoku zestaw wyników widoku jest natychmiast materializowany i zapisywany w pamięci fizycznej w bazie danych, co pozwala zaoszczędzić na kosztach związanych z wykonaniem tej kosztownej operacji w czasie wykonywania.
Po drugie, te indeksowane widoki mogą działać, nawet jeśli nie są bezpośrednio przywoływane przez inne zapytanie, ponieważ optymalizator użyje ich zamiast odwołania do tabeli, gdy jest to właściwe.
Ponownie dokumentacja:
Zindeksowany widok można wykorzystać do wykonania zapytania na dwa sposoby. Kwerenda może bezpośrednio odwoływać się do widoku indeksowanego lub, co ważniejsze, optymalizator kwerendy może wybrać widok, jeśli ustali, że widok może zostać zastąpiony częścią lub całością zapytania w planie najtańszych zapytań. W drugim przypadku zamiast tabel bazowych i ich zwykłych indeksów używany jest widok indeksowany. Do widoku nie trzeba odwoływać się w zapytaniu, aby optymalizator zapytań mógł z niego korzystać podczas wykonywania zapytania. Umożliwia to istniejącym aplikacjom korzystanie z nowo utworzonych widoków indeksowanych bez zmiany tych aplikacji.
Ta dokumentacja, a także wykresy przedstawiające poprawę wydajności, można znaleźć tutaj .
Aktualizacja 2: odpowiedź została skrytykowana na podstawie tego, że to „indeks” zapewnia przewagę wydajności, a nie „widok”. Łatwo to jednak obalić.
Powiedzmy, że jesteśmy firmą programistyczną w małym kraju; Jako przykład wykorzystam Litwę. Sprzedajemy oprogramowanie na całym świecie i przechowujemy nasze dane w bazie danych SQL Server. Odnosimy sukcesy, więc za kilka lat mamy ponad 1 000 000 rekordów. Jednak często musimy zgłaszać sprzedaż do celów podatkowych i okazało się, że sprzedaliśmy tylko 100 kopii naszego oprogramowania w naszym kraju. Tworząc indeksowany widok tylko litewskich rekordów, możemy zachować potrzebne rekordy w indeksowanej pamięci podręcznej, jak opisano w dokumentacji MS. Kiedy uruchomimy nasze raporty dotyczące sprzedaży na Litwie w 2008 r., Nasze zapytanie przeszuka indeks o głębokości zaledwie 7 (Log2 (100) z nieużywanymi liśćmi). Gdybyśmy zrobili to samo bez WIDOKU i polegając tylko na indeksie w tabeli, musielibyśmy przejść przez drzewo indeksów o głębokości wyszukiwania 21!
Oczywiście sam widok zapewniłby nam przewagę wydajności (3x) nad prostym użyciem samego indeksu. Próbowałem użyć rzeczywistego przykładu, ale zauważysz, że prosta lista sprzedaży na Litwie dałaby nam jeszcze większą przewagę.
Zauważ, że po prostu używam prostej b-drzewa dla mojego przykładu. Chociaż jestem całkiem pewien, że SQL Server używa jakiegoś wariantu b-drzewa, nie znam szczegółów. Niemniej jednak chodzi o to.
Aktualizacja 3: Pojawiło się pytanie, czy widok indeksowany korzysta tylko z indeksu umieszczonego na podstawowej tabeli. Innymi słowy, parafrazując: „widok indeksowany jest tylko odpowiednikiem standardowego indeksu i nie oferuje niczego nowego ani unikalnego dla widoku”. Gdyby to była prawda, powyższa analiza byłaby nieprawidłowa! Pozwól, że przedstawię cytat z dokumentacji Microsoft, który pokazuje, dlaczego uważam, że ta krytyka jest nieprawidłowa lub prawdziwa:
Używanie indeksów w celu poprawy wydajności zapytań nie jest nową koncepcją; jednak widoki indeksowane zapewniają dodatkowe korzyści w zakresie wydajności, których nie można osiągnąć przy użyciu standardowych indeksów.
W połączeniu z powyższym cytatem dotyczącym trwałości danych w pamięci fizycznej i innymi informacjami w dokumentacji dotyczącej tworzenia indeksów w widokach, myślę, że można bezpiecznie powiedzieć, że widok indeksowany to nie tylko buforowany wybór SQL, który korzysta z indeks zdefiniowany w głównej tabeli. Dlatego nadal podtrzymuję tę odpowiedź.