Jest
select * from myView
szybciej niż samo zapytanie, aby utworzyć widok (w celu uzyskania tego samego zestawu wyników):
select * from ([query to create same resultSet as myView])
?
Nie jest dla mnie całkowicie jasne, czy widok używa jakiegoś buforowania, dzięki czemu jest szybszy w porównaniu z prostym zapytaniem.
sql
sql-server
performance
JohnIdol
źródło
źródło
Odpowiedzi:
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 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:
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:
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ź.
źródło
Ogólnie rzecz biorąc, nie. Widoki są używane przede wszystkim ze względu na wygodę i bezpieczeństwo i same w sobie nie przynoszą korzyści w zakresie prędkości.
To powiedziawszy, SQL Server 2000 i wyżej mają funkcję o nazwie Widoki indeksowane, która może znacznie poprawić wydajność, z kilkoma zastrzeżeniami:
COUNT
,MIN
,MAX
, lubTOP
.W tym artykule opisano dodatkowe korzyści i ograniczenia indeksowanych widoków :
źródło
Przynajmniej w SQL Server plany kwerend są przechowywane w pamięci podręcznej planu zarówno dla widoków, jak i zwykłych zapytań SQL, w oparciu o parametry zapytania / widoku. Oba są usuwane z pamięci podręcznej, gdy nie są używane przez wystarczająco długi okres, a miejsce jest potrzebne na inne nowo przesłane zapytanie. Następnie, jeśli zostanie wydane to samo zapytanie, zostanie ono ponownie skompilowane, a plan zostanie ponownie umieszczony w pamięci podręcznej. Więc nie, nie ma różnicy, biorąc pod uwagę, że ponownie używasz tego samego zapytania SQL i tego samego widoku z tą samą częstotliwością.
Oczywiście, ogólnie widok, z samej swojej natury (że ktoś myślał, że należy go używać wystarczająco często, aby zrobić z niego widok), jest na ogół bardziej prawdopodobne, że zostanie „ponownie użyty” niż jakakolwiek dowolna instrukcja SQL.
źródło
EDYCJA: Myliłem się i powinieneś zobaczyć odpowiedź Marka powyżej.
Nie mogę mówić z doświadczenia z SQL Server , ale dla większości baz danych odpowiedź brzmiałaby „nie”. Jedyną potencjalną korzyścią wynikającą z korzystania z widoku jest to, że potencjalnie może on tworzyć ścieżki dostępu na podstawie zapytania. Ale głównym powodem korzystania z widoku jest uproszczenie zapytania lub ustandaryzowanie sposobu uzyskiwania dostępu do niektórych danych w tabeli. Ogólnie rzecz biorąc, nie uzyskasz korzyści w zakresie wydajności. Jednak mogę się mylić.
Wymyślę nieco bardziej skomplikowany przykład i sam go zobaczę.
źródło
Może to być szybsze, jeśli utworzysz widok zmaterializowany ( z powiązaniem schematu ). Nie zmaterializowane widoki są wykonywane tak jak zwykłe zapytania.
źródło
Rozumiem, że jakiś czas temu widok byłby szybszy, ponieważ SQL Server mógłby przechowywać plan wykonania, a następnie użyć go zamiast próbować go opracowywać w locie. Myślę, że dzisiejszy wzrost wydajności prawdopodobnie nie jest tak świetny, jak kiedyś, ale musiałbym zgadywać, że można by nieznacznie poprawić wykorzystanie tego widoku.
źródło
Zdecydowanie widok jest lepszy niż zapytanie zagnieżdżone dla programu SQL Server. Nie wiedząc dokładnie, dlaczego jest to lepsze (dopóki nie przeczytam postu Marka Brittinghama), przeprowadziłem kilka testów i doświadczyłem prawie szokującej poprawy wydajności podczas korzystania z widoku w porównaniu do zagnieżdżonego zapytania. Po uruchomieniu każdej wersji zapytania kilkaset razy z rzędu wersja podglądu zapytania zakończyła się w połowie czasu. Powiedziałbym, że to dla mnie wystarczający dowód.
źródło
Spodziewałbym się, że dwa zapytania będą działać identycznie. Widok jest niczym więcej niż zapisaną definicją zapytania, nie ma buforowania ani przechowywania danych dla widoku. Optymalizator skutecznie zamieni twoje pierwsze zapytanie w drugie, gdy je uruchomisz.
źródło
Wszystko zależy od sytuacji. Widoki indeksowane MS SQL są szybsze niż normalny widok lub zapytanie, ale widoków indeksowanych nie można używać w odbiciu lustrzanej bazy danych (MS SQL).
Widok w dowolnej pętli spowoduje poważne spowolnienie, ponieważ widok jest ponownie zapełniany za każdym razem, gdy jest wywoływany w pętli. Taki sam jak zapytanie. W tej sytuacji tymczasowa tabela używająca # lub @ do przechowywania danych w pętli jest szybsza niż widok lub zapytanie.
Wszystko zależy więc od sytuacji.
źródło
Nie ma praktycznej różnicy, a jeśli przeczytasz BOL, przekonasz się, że zawsze stary zwykły SQL SELECT * FROM X korzysta z buforowania planu itp.
źródło
Przechowywanie planu wykonania powinno być trywialne, ale będzie nieistotne.
źródło
Celem widoku jest ciągłe używanie zapytania. W tym celu SQL Server, Oracle itp. Zazwyczaj zapewniają „widok buforowany” lub „skompilowany” widok, poprawiając w ten sposób jego wydajność. Zasadniczo powinno to działać lepiej niż „proste” zapytanie, chociaż jeśli zapytanie jest naprawdę bardzo proste, korzyści mogą być znikome.
Teraz, jeśli wykonujesz złożone zapytanie, utwórz widok.
źródło
Według mnie korzystanie z widoku jest nieco szybsze niż normalne zapytanie. Moja procedura składowana trwała około 25 minut (praca z innymi większymi zestawami rekordów i wieloma połączeniami), a po użyciu widoku (bez klastrów) wydajność była tylko trochę szybsza, ale wcale nie znacząca. Musiałem użyć innych technik / metod optymalizacji zapytań, aby dokonać radykalnej zmiany.
źródło
Wybór z widoku lub z tabeli nie będzie miał większego sensu.
Oczywiście, jeśli widok nie zawiera niepotrzebnych połączeń, pól itp. Możesz sprawdzić plan wykonania swoich zapytań, połączeń i indeksów używanych do poprawy wydajności widoku.
Możesz nawet utworzyć indeks widoków, aby przyspieszyć wyszukiwanie. http://technet.microsoft.com/en-us/library/cc917715.aspx
Ale jeśli szukasz czegoś w stylu „% ...%”, silnik SQL nie skorzysta z indeksu w kolumnie tekstowej. Jeśli możesz zmusić użytkowników do wyszukiwania takich jak „...%”, to będzie to szybkie
odniósł się do odpowiedzi na forach asp: https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+
źródło
Wbrew wszelkim oczekiwaniom widoki są w niektórych okolicznościach znacznie wolniejsze.
Odkryłem to niedawno, gdy miałem problemy z danymi pobranymi z Oracle, które wymagały masowania w innym formacie. Może 20k wierszy źródłowych. Mały stolik. Aby to zrobić, zaimportowaliśmy dane Oracle w sposób niezmieniony do tabeli, a następnie wykorzystaliśmy widoki do wyodrębnienia danych. Na podstawie tych poglądów mieliśmy poglądy wtórne. Może 3-4 poziomy widoków.
Jedno z ostatnich zapytań, które wyodrębniło może 200 wierszy, potrwa ponad 45 minut! To zapytanie było oparte na kaskadzie widoków. Może 3-4 poziomy głębokości.
Mogłem wziąć każdy z omawianych widoków, wstawić jego kod SQL do jednego zagnieżdżonego zapytania i wykonać go w ciągu kilku sekund.
Odkryliśmy nawet, że możemy nawet zapisać każdy widok do tabeli tymczasowej i zapytać go zamiast widoku, a to wciąż jest o wiele szybsze niż zwykłe użycie widoków zagnieżdżonych.
Jeszcze dziwniejsze było to, że wydajność była dobra, dopóki nie osiągnęliśmy limitu wierszy źródłowych pobieranych do bazy danych, po prostu spadła z klifu w ciągu kilku dni - wystarczyło kilka kolejnych wierszy źródłowych.
Tak więc używanie zapytań pobranych z widoków pobranych z widoków jest znacznie wolniejsze niż zapytanie zagnieżdżone - co nie ma dla mnie sensu.
źródło
Natknąłem się na ten wątek i chciałem po prostu udostępnić ten post od Brenta Ozara jako coś do rozważenia podczas korzystania z grup dostępności.
Raport o błędzie Brenta Ozara
źródło