Po przeczytaniu powolnego zapytania SQL, nie będąc pewnym, jak go zoptymalizować , pomyślałem o ogólnej wydajności zapytań. Z pewnością potrzebujemy, aby wyniki pierwszej tabeli (gdy połączone są inne tabele) były możliwie jak najmniejsze przed dołączeniem (złączenia wewnętrzne dla tego pytania), aby nasze zapytania były nieco szybsze.
Przykład:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Bądź lepszy / szybszy niż:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Moja teoria jest następująca (może to nie być poprawna implementacja, próbuję zapamiętać z przeczytanej przeze mnie książki o SQL Server 2008 (MSFT Press)):
- Procesor zapytań najpierw pobiera lewą tabelę (tabela1)
- Dołącza do drugiej tabeli (tabela 2) i tworzy produkt kartezjański przed odfiltrowaniem niezbędnych wierszy (jeśli dotyczy)
- Następnie wykonuje klauzule WHERE, ORDER BY, GROUP BY, HAVING z instrukcją SEELCT jako ostatnią.
Jeśli więc w powyższym zestawieniu nr 1 tabela jest mniejsza, aparat SQL ma mniej pracy przy tworzeniu produktów kartezjańskich. Następnie po osiągnięciu instrukcji where masz ograniczony zestaw wyników do filtrowania w pamięci.
Mógłbym być tak daleko od znaku, że to nierealne. Tak jak powiedziałem, to teoria.
Twoje myśli?
Uwaga : Właśnie pomyślałem o tym pytaniu i nie miałem jeszcze okazji przeprowadzić żadnych testów.
Uwaga 2 : Oznaczone jako SQL Server, jak nie wiem nic na temat wdrażania MySQL itp Prosimy o odpowiedź / komentarz anyway
źródło