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.
Czy możesz przetestować trzecią wersję: 'WYBIERZ * Z WEWNĘTRZNEGO ŁĄCZENIA B WŁ. A.X = B.Y I B.Z = 1'? –
@ JoëlSalamin Ma to mniej więcej tyle samo czasu, co pierwsza wolna wersja. – user3726374
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'' –