Najlepsza odpowiedź
Chociaż zarówno łączenia, jak i podzapytania mają swoje miejsce w instrukcjach SQL, osobiście zawsze staram się pisać swoje zapytania wyłącznie przy użyciu łączeń . Tymczasem podzapytanie wprowadzam tylko wtedy, gdy nie mogę bez niego pobrać potrzebnych danych.
Przyczyna jest taka, że łączenia są wykonywane szybciej. W rzeczywistości posunąłbym się nawet do stwierdzenia, że czas pobierania zapytania przy użyciu łączeń będzie prawie zawsze krótszy niż w przypadku podzapytania.
Przyczyną jest to, że łączenia zmniejszają obciążenie obliczeniowe bazy danych, zastępując wiele zapytań jednym zapytaniem łączącym. To z kolei lepiej wykorzystuje możliwości bazy danych do przeszukiwania, filtrowania i sortowania rekordów.
Oczywiście, gdy dodajesz więcej sprzężeń do zapytania, serwer bazy danych musi wykonać więcej pracy, co przekłada się na do wolniejszych czasów pobierania danych.
Chociaż łączenia są konieczne do pobierania danych ze znormalizowanej bazy danych, ważne jest, aby były one zapisywane poprawnie, ponieważ nieprawidłowe łączenia mogą spowodować poważne obniżenie wydajności i niedokładne wyniki zapytań.
W niektórych przypadkach podzapytania mogą zastępować złożone sprzężenia i związki z minimalnym negatywnym wpływem na wydajność.
Przykłady podzapytań
Czasami nie da się tak naprawdę obejść za pomocą podzapytania. Oto kilka przykładów użycia przykładowej bazy danych Sakila dla MySQL i mojego klienta do tworzenia baz danych Navicat .
Przykład # 1: Używanie funkcji agregującej jako części klauzuli JOIN
W większości przypadków tabele są łączone we wspólnym polu. W rzeczywistości nie jest niczym niezwykłym, że wspólne pole ma tę samą nazwę, aby pokazać, że są to te same dane. Jednak w poniższym zapytaniu tabela klientów jest łączona z najnowszą (MAX) wartością create\_date, dzięki czemu wyniki zapytania dotyczą klienta, który zarejestrował się ostatnio.
Podzapytanie jest używane, ponieważ nie można używać funkcji agregujących jako część klauzuli WHERE. To genialne obejście pozwala obejść to ograniczenie!
Przykład 2:
W tym zapytaniu jest używane podzapytanie w celu pobrania pośredniego zestawu wyników, abyśmy mogli zastosować funkcję AVG () do LICZBY wypożyczonych filmów. To jest to, co nazywam podwójną agregacją, ponieważ stosujemy agregację (AVG) do wyniku innego (COUNT).
To konkretne zapytanie jest dość szybkie – zajmuje tylko 0,044 sekundy – ponieważ zapytanie wewnętrzne zwraca pojedyncza wartość. Zwykle najwolniejsze zapytania to te, które wymagają pełnego skanowania tabeli.
Mam nadzieję, że to odpowiedź na Twoje pytanie.
Pozdrawiam!
Adam
Odpowiedź
Zwykle powinieneś pisać zapytania, aby były jak najbardziej przejrzyste i pozostawić optymalizację procesorowi zapytań RDBMS i administratorowi DBA, jeśli taki masz, który jest odpowiedzialny za dostrajanie projektu fizycznego. w większości przypadków powinno dać wystarczająco dobrą wydajność, ale są wyjątki. Czasami optymalizator zapytań RDBMS ma martwe punkty lub złe przypadki.
Teraz, jeśli łączenia lub podzapytania będą stanowić problem dla optymalizator, jest dużo bardziej prawdopodobne, że będzie on znajdował się w podzapytaniach. Dzieje się tak, ponieważ łączenie jest podstawową cechą języka, z której wszyscy użytkownicy korzystają, podczas gdy wielu użytkowników w ogóle nie używa podzapytań. Odkryłem, że konwertuje aplikację z Sybase do SQL Server musiałem przepisać wiele podzapytań jako złączenia z powodu błędów w oprogramowaniu Microsoft obsługa podzapytań – aczkolwiek w bardzo specyficznym przypadku (gdzie podzapytanie where zawierało powiązany parametr). Nie jest zaskakujące, że SQL Server miał błędy w podzapytaniach, ponieważ tak wielu jego klientów używa SQL Server z graficznymi edytorami zapytań firmy Microsoft, które w naturalny sposób tworzą łączenia, ale nie podzapytania.
Zazwyczaj odradzam przedwczesną optymalizację, ale zrobię tutaj wyjątek. Jeśli aplikacja ma być przenośna na wiele platform bazodanowych, w większości przypadków wolałbym łączenie z podzapytaniami, ponieważ jest bardziej prawdopodobne, że napotkasz błędy lub złe wybory optymalizatora z podzapytaniami. aplikacja nie musi być przenośna, zapisz zapytanie w sposób, który wydaje się najbardziej naturalny i jeśli nie ma problemu – który będzie przez większość czasu – w porządku. Jeśli wystąpi problem, przepisz zapytanie w inny sposób, aby zobaczyć, czy to pomaga. A jeśli masz administratora, skonsultuj się z nim w sprawie problemów z wydajnością.