2014-09-30 17 views
5

Prędkość wykonywania następujących zapytań jest drastycznie inna. Drugi kończy się o rząd wielkości szybciej niż pierwszy.SQL INNER JOIN automatyczna optymalizacja w HSQLDB

SELECT * FROM A INNER JOIN B ON A.X=B.Y WHERE B.Z=1 
SELECT * FROM A INNER JOIN (SELECT * FROM B) ON A.X=B.Y WHERE B.Z=1 

Byłoby wspaniale, gdyby ktoś napisał, dlaczego tak jest. Baza danych to HSQLDB z JDBC.

Dodatkowe informacje: Wersja HSQLDB jest 2.3.2. A kolumna A.X jest indeksowana, ale kolumna B.Y nie jest.

+1

Czy możesz przetestować trzecią wersję: 'WYBIERZ * Z WEWNĘTRZNEGO ŁĄCZENIA B WŁ. A.X = B.Y I B.Z = 1'? –

+0

@ JoëlSalamin Ma to mniej więcej tyle samo czasu, co pierwsza wolna wersja. – user3726374

+0

Może to być spowodowane tym, że 'B.Y' nie jest indeksowany. Czy możesz wypróbować tę inną wersję i powiedzieć mi, czy występuje wzrost/utrata wydajności: 'WYBIERZ * OD ŁĄCZENIA WEWNĘTRZNEGO (WYBIERZ * Z B, GDZIE BZ = 1) NA AX = BY'' –

Odpowiedz

1

Odpowiedź brzmi: indexing

Wyobraź sobie, że mam słownika i ktoś daje mi zadanie znalezienia 5000 słów w nim. Zadanie to zajęłoby mi kilka godzin.
Ale teraz wyobraź sobie, że ten słownik jest nieposortowany. Znalezienie wszystkich tych słów zajęłoby mi całe lata.
Komputer jest szybszy i do pierwszego zadania potrzebuje tylko milisekund, a drugie zadanie pozostaje kilka sekund.

Dlaczego pierwsze zapytanie jest tak wolne?

Dzieje się tak, ponieważ istnieje INNER JOIN i odbywa się on na kolumnie z indeksem niepotwierdzonym.

Dlaczego drugie zapytanie jest tak szybkie?

Dzieje się tak, ponieważ istnieje podzapytanie. Podzapytanie zostało zmaterializowane na tymczasową tabelę, a indeks jest tworzony dla kolumny łączenia. Nie dołączasz teraz do tabeli z indeksem niepotwierdzonym, ale do tabeli tymczasowej z indeksowaniem. HSQLDB tworzy to indeksowanie na tabeli tymczasowej, aby ułatwić dołączenie. Nawet jeśli zmienisz warunek łączenia na bardziej złożony (na przykład: A.X = B.Y + 2*B.Z), zapytanie to będzie nadal szybkie. Oznacza to, że HSQLDB tworzy indeks dla wyrażenia używanego w warunku łączenia.

+0

To z pewnością ma sens. Czy może masz jakieś odniesienia do tego, co opisałeś? – user3726374