Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy widok jest szybszy niż proste zapytanie?

Tak , widoki mogą mają przypisany indeks klastrowy, a gdy to zrobią, będą przechowywać tymczasowe wyniki, które mogą przyspieszyć wynikowe zapytania.

Własna dokumentacja Microsoftu bardzo jasno pokazuje, że widoki mogą poprawić wydajność.

Po pierwsze, większość widoków tworzonych przez ludzi jest prosta widoki i nie używają tej funkcji, a zatem nie różnią się od bezpośredniego wykonywania zapytań dotyczących tabel podstawowych. Proste widoki są rozwijane w miejscu, więc nie przyczyniają się bezpośrednio do poprawy wydajności - to prawda. Jednak zindeksowane widoki mogą dramatycznie poprawić wydajność.

Przejdę bezpośrednio do dokumentacji:

Po utworzeniu unikalnego indeksu klastrowego w widoku zestaw wyników widoku jest natychmiast materializowany i utrwalany w fizycznej pamięci masowej w bazie danych, co oszczędza koszty wykonywania tej kosztownej operacji w czasie wykonywania.

Po drugie, te zindeksowane widoki mogą działać nawet jeśli nie są bezpośrednio przywoływane przez inne zapytanie ponieważ optymalizator użyje ich zamiast odniesień do tabeli, gdy będzie to konieczne.

Ponownie, dokumentacja:

Widok indeksowany może być używany w wykonaniu zapytania na dwa sposoby. Kwerenda może odwoływać się bezpośrednio do indeksowanego widoku lub, co ważniejsze, optymalizator kwerend może wybrać widok, jeśli ustali, że widok może być zastąpiony dla niektórych lub wszystkich kwerend w najtańszym planie kwerend. W drugim przypadku widok indeksowany jest używany zamiast bazowych tabel i ich zwykłych indeksów. Widok nie musi być przywoływany w zapytaniu, aby optymalizator zapytań używał go podczas wykonywania zapytania. Dzięki temu istniejące aplikacje mogą korzystać z nowo utworzonych indeksowanych widoków bez zmiany tych aplikacji.

Tę dokumentację oraz 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”. Można to jednak łatwo obalić.

Powiedzmy, że jesteśmy firmą programistyczną w małym kraju; Jako przykład użyję Litwy. Sprzedajemy oprogramowanie na całym świecie i przechowujemy nasze dane w bazie danych SQL Server. Odnosimy duże sukcesy i za kilka lat mamy ponad 1 000 000 rekordów. Jednak często musimy zgłaszać sprzedaż do celów podatkowych i okazuje się, że sprzedaliśmy tylko 100 kopii naszego oprogramowania w naszym kraju. Tworząc indeksowany widok tylko rekordów litewskich, możemy przechowywać potrzebne rekordy w indeksowanej pamięci podręcznej, jak opisano w dokumentacji MS. Gdy 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 kilkoma niewykorzystanymi liśćmi). Gdybyśmy zrobili to samo bez WIDOKU i polegali tylko na indeksie w tabeli, musielibyśmy przeszukiwać drzewo indeksów o głębokości wyszukiwania wynoszącej 21!

Oczywiście sam widok zapewniłby nam przewagę wydajności (3x) w porównaniu z 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 w moim przykładzie używam prostego b-drzewa. Chociaż jestem prawie pewien, że SQL Server używa jakiegoś wariantu b-drzewa, nie znam szczegółów. Niemniej jednak, punkt jest aktualny.

Aktualizacja 3: Pojawiło się pytanie, czy widok indeksowany po prostu używa indeksu umieszczonego w tabeli bazowej. To znaczy, parafrazując:„widok indeksowany jest tylko odpowiednikiem indeksu standardowego i nie oferuje niczego nowego ani unikalnego dla widoku”. Gdyby to była oczywiście prawda, to powyższa analiza byłaby błędna! Pozwólcie, że przedstawię cytat z dokumentacji firmy Microsoft, który pokazuje, dlaczego uważam, że ta krytyka jest niesłuszna lub nieprawdziwa:

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.

Wraz z powyższym cytatem dotyczącym trwałości danych w pamięci fizycznej i innymi informacjami w dokumentacji o tym, jak indeksy są tworzone w Widokach, myślę, że można śmiało powiedzieć, że widok indeksowany nie tylko buforowany SQL Select, który używa indeksu zdefiniowanego w głównej tabeli. Dlatego nadal obstaję przy tej odpowiedzi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zmienić ograniczenie klucza podstawowego za pomocą składni SQL?

  2. Co to jest unikalne ograniczenie w SQL Server — SQL Server / samouczek TSQL, część 95

  3. Co to jest LEN() w SQL Server?

  4. Jak usunąć wiodące i końcowe białe znaki w SQL Server — TRIM()

  5. 3 sposoby uzyskania etapów zadania zadania agenta serwera SQL (T-SQL)