Temat: Jak efektywnie posortować wyniki zapytania UNION z bazy...
Przemysław R.:
hmm
czasem warto zrobić temporaty table i założyć na niej indeks po dodaniu kompletu danych
zrobienie inserta do tabeli bez indeksów nie jest aż tak czasochłonne a suma sumarum może się opłacić
A dlaczego nie najpierw poindeksować a potem wstawiać? Myślisz, że narzut na wielokrotne równoważenie drzewa (indeksy) będzie dużo większy niż na jego budowę? Nie jestem tego pewien, trzeba by sprofilować.
Pomysł z temp table jes generalnie niegłupi, ale tworzenie w każdym zapytaniu tabeli też kosztuje (*)
A może po prostu tak:
SELECT * FROM
(SELECT * FROM A WHERE ...
UNION
SELECT * FROM B WHERE...)
ORDER BY ...
jeśli A i B są indeksowane i kryterium wyszukiwania ten indeks wykorzystuje, to indeksy się nie pogubią. Żeby wykorzystać te indeksy i pomóc bazie można jeszcze tak:
SELECT * FROM
(SELECT * FROM A WHERE...
ORDER BY ...
UNION
SELECT * FROM B WHERE...
ORDER BY ...)
ORDER BY ...
(*) - jeśli wyników zapytania do posortowania jest dużo, to wg mnie zaproponowana przez Przemka tymczasowa tabela, którą poindeksujemy i posortujemy ma duży sens.
Wreszcie, można stworzyć zmaterializowany widok, na który założy się indeksy, a w zapytaniu tworzącym widok dane będą sortowane.
Rozwiązania należałoby porównać - zebranie statystyk i sprofilowanie.
Nie sortować na kliencie. Szczególnie jeśli danych do posortowania będzie dużo. Oprócz tego, że baza zrobi to szybciej używając indeksów, to na serwerze aplikacyjnym, w zależności od algorytmu sortującego, mogą się pojawić dodatkowe narzuty: dodatkowe włączenia GC, zmiana HeapSize itp. Bez sensu.
Jakub Fila edytował(a) ten post dnia 11.11.11 o godzinie 13:03