Czy widoki baz danych są jedynie sposobem na uproszczenie dostępu do danych lub czy zapewniają korzyści wydajnościowe podczas uzyskiwania dostępu do widoków, a nie tylko do uruchamiania kwerendy, na której oparty jest widok? Podejrzeń, które podejrzenia są funkcjonalnie równoważne tylko dodanie kwerendy przechowywanego widoku do każdego kwerendy na dane widoku, czy jest to poprawne, czy są inne szczegóły i/lub optymalizacje?Czy widoki bazy danych wpływają na wydajność zapytań?
Odpowiedz
To zależy od RDBMS, ale zwykle nie ma optymalizacji, a to tylko wygodny sposób na uproszczenie zapytań. Niektóre systemy baz danych używają jednak "zmaterializowanych widoków", które wykorzystują mechanizm buforowania.
Zwykle widok jest po prostu sposobem na stworzenie wspólnego skrótu do definiowania zestawów wyników, których często potrzebujesz.
Jednak ma swoją wadę. Pokusa polega na dodawaniu w każdej kolumnie, którą według ciebie możesz potrzebować gdzieś, kiedy chcesz skorzystać z widoku. Więc YAGNI jest naruszone. Nie tylko kolumny, ale czasami dodatkowe sprzężenia zewnętrzne są łączone "na wszelki wypadek". Tak więc indeksy pokrywające mogą już nie obejmować, a plan kwerend może zwiększyć złożoność (i spadek wydajności).
YAGNI to krytyczna koncepcja w projektowaniu SQL.
Zabawne, jak zawsze przestrzegałem zasad YAGNI, ale nie wiedziałem, że istniały, dopóki nie spojrzałem na YAGNI :) – SAMills
Zawsze uważałem, że Widoki są jak Procedury przechowywane tylko do odczytu. Dajesz bazy danych jak najwięcej informacji z wyprzedzeniem, aby mogła ona wstępnie skompilować wszystko, co możliwe.
Można również wyświetlać widoki indeksu, co pozwala uzyskać dostęp do zoptymalizowanego widoku danych, których szukasz, dla danego typu zapytania.
Jakieś prawdziwe tego przykłady? Czy znasz dowolny RDMS, który będzie wykonywać szybciej w widoku niż w równoważnej instrukcji select? Oczywiście indeks pomaga, ale ten indeks również pomaga w wyborze instrukcji. Twoja odpowiedź sugeruje, że widok jest szybszy, zastanawiałem się tylko, czy masz dowód czy po prostu zgadujesz? –
Żaden serwer DB, o którym wiem, tworzy plan wykonywania zapytań w momencie tworzenia widoku lub procedury składowanej. Plany wykonania wymagają statystyk indeksu, które nie są dostępne w czasie kompilacji. Kompilacja przekształca SQL/DDL w wewnętrzny format. –
sindre, niektóre serwery DB obsługują "widoki indeksowane", które bardziej przypominają "widoki zmaterializowane" - bliższe tabeli automatycznie obsługiwanej niż widok jako taki. –
Ogólnie rzecz biorąc, widoki powinny działać w sposób równoważny z zapytaniem zapisanym bezpośrednio w tabelach podstawowych.
Ale: mogą występować przypadki krańcowe i należy wypróbować kod. Wszystkie nowoczesne systemy RDBMS mają narzędzia, które umożliwiają wyświetlanie planów kwerend i monitorowanie wykonania. Nie bierz mi za to mojego (lub cudzego) słowa, kiedy możesz mieć ostateczne dane na wyciągnięcie ręki.
Mimo że pewne zapytanie uruchomione w widoku i to samo zapytanie działające poza widokiem powinno działać równorzędnie, rzeczy stają się znacznie bardziej skomplikowane, gdy trzeba połączyć dwa widoki razem. Możesz łatwo zakończyć przynosząc tabele, których nie potrzebujesz do zapytania lub przynosząc tabele w redundancji. Optymalizator bazy danych może mieć więcej problemów z tworzeniem dobrego planu wykonywania zapytań. Podczas gdy poglądy mogą być bardzo dobre pod względem dopuszczenia bardziej drobnoziarnistych zabezpieczeń i tym podobnych, niekoniecznie są dobre dla modułowości.
Wiem, że to stary wątek. Dyskusja jest dobra, ale chcę rzucić jeszcze jedną myśl. Wydajność zależy również od tego, czego używasz do pobierania danych. Na przykład, jeśli kończysz z czymś takim jak Microsoft Access, możesz zdecydowanie zwiększyć wydajność niektórych złożonych zapytań za pomocą widoku. Dzieje się tak dlatego, że program Access nie zawsze pobiera dane z serwera SQL, tak jak byśmy chcieli - w niektórych przypadkach przyciągałby całe tabele, a następnie próbowałby stamtąd przetwarzać lokalnie! Nie, jeśli używasz widoku.
Tak, we wszystkich nowoczesnych programach RDBMS (MSSQL po 2005 r. Itd.) Plany zapytań widoku są buforowane, co eliminuje obciążenie związane z planowaniem kwerendy i przyspiesza działanie w stosunku do tego samego SQL wykonywanego w trybie on-line. Poprzednio (i dotyczy to również sparametryzowanych instrukcji SQL/Przygotowanych), ludzie prawidłowo myśleli, że procedury przechowywane lepiej działały.
Wiele wciąż pozostaje na ten temat, czyniąc go nowoczesnym mottem DB. Od czasu, gdy widoki/PS otrzymały buforowane planowanie zapytań o SP, były prawie równe.
- 1. Jak ograniczenia ADO.NET DataTable wpływają na wydajność?
- 2. Czy ograniczenia klucza obcego wpływają na przekształcanie zapytań w Oracle?
- 3. Czy można zagnieździć widoki bazy danych?
- 4. Wyświetl wszystkie widoki bazy danych Oracle
- 5. jest jakiś sposób na poznanie aktualizacji bazy danych bez zapytań/mniej zapytań?
- 6. Wydajność bazy Firebase z dużymi zbiorami danych
- 7. zagnieżdżone alternatywy wydajność zapytań
- 8. Czy niektóre RewriteCond wpływają na wiele zasad
- 9. Czy fałszywe pobudki wpływają na Thread.sleep?
- 10. Czy baza danych zapytań w pamięci podręcznej zapytań sql Railsów?
- 11. Czy uruchamianie bazy danych SQL Server 2005 na poziomie zgodności 80 ma negatywny wpływ na wydajność?
- 12. Kopiowanie bazy danych w MySQL, jak kopiować widoki?
- 13. Firebase - czy buforowanie poprawia wydajność?
- 14. Wpływają na to protokoły Clojure'a?
- 15. Wydajność ORM (szczególnie NHibernate) dla złożonych zapytań
- 16. Definiowanie zapytań do bazy danych w szablonach Velocity
- 17. Bazy danych do przetwarzania zapytań w języku naturalnym
- 18. Preferowany sposób wielokrotnego wysyłania zapytań do bazy danych?
- 19. Wykonanie dwóch zapytań w jednym cyklu podróży do bazy danych
- 20. Optymalizacja zapytań do bazy danych w Django REST ramach
- 21. Przechowywanie i wysyłanie zapytań do JSON z bazy danych
- 22. zapytań run okresowo (ala crontab) z bazy danych postgresql
- 23. Wydajność bazy danych widoku w stosunku do nowej tabeli
- 24. Zapobieganie wstawianiu zapytań MySQL-Python wokół parametru nazwy bazy danych
- 25. Zapisywanie wszystkich zapytań SQL do bazy danych w Railsach
- 26. Android SQLite wydajność w złożonych zapytań
- 27. Jak ważne jest wybranie najmniejszego możliwego typu danych podczas projektowania bazy danych?
- 28. Nieregularna indeksowana wydajność zapytań w PostgreSQL
- 29. Aktualizacja bazy danych na __destruct()?
- 30. Czy modalne javascript popup (np. Fancybox) wpływają na roboty indeksujące?
Nie mogę się doczekać, aby przeczytać odpowiedzi. Z praktycznego doświadczenia wynika, że jeśli wynikowy zbiór wyników jest znaczący, stwierdziliśmy, że uzyskujemy lepszą wydajność poprzez uwzględnienie widoku w procedurze do przycięcia zestawu wyników. – SAMills