ORDER BY na bardzo dużej bazie danych

0

Problem wygląda następująco.

Mam bazę danych z około 15tys produktów. Każdy z nich ma ok 250 atrybutów.
Problem pojawia się przy zaawansowanym szukaniu, które uwzględnia szukanie po kilku z atrybutów. I tak standardowe zaawansowane zapytanie trwa nawet 16sek i potrafi analizować nawet do 12mln rekordów (Rows_examined)
Po usunięciu zapisu ORDER BY cały proces trwa mniej niż 1sek i wyniki zwracane są prawie w czasie rzeczywistym.

Zależy mi jednak na pozostawieniu sortowania, gdyż znacznie to ułatwia przeglądanie ofert.
Przykładowo jednym z atrybutów jest cena_produktu wiec nie wyobrażam sobie serwisu, który takiego sortowania nie udostępnia.

Czy jest jakiś sensowny sposób na zastosowanie ORDER BY cena_produktu ASC/DESC nie wpływający aż tak bardzo na czas całego zapytania? Dodam jeszcze, że stosuję paginację wiec w zapytaniu pojawia się LIMIT x, y

Myślałem nad pobraniem wszystkich danych (bez porcjowania LIMITem) i na rezultatach tego zapytania (czyli jak już mam właściwe rekordy) wykonać ORDER. Niestety jakoś z tym sobie nie mogę poradzić.

Będę wdzięczny za każdą, nawet najmniejszą wskazówkę :)

1

Dodaj index na kolumnie używanej w order by.

0

@serek
Nie wiem czy aktualna struktura bazy mi na to pozwoli?
Tak w skrócie:

jeśli chodzi o tabelę to wygląda to następująco:
**produkt **(id, sortowanie, licznik, data_dodania)
produkt_wartosc(id, nazwa, opis, id_produkt, seo, jezyk)
atrybut (id, sortowanie)
atrybut_wartosc (id,nazwa,wartosc,id_atrybut,jezyk)
produkt_atrybut(id,id_atrybut, id_produkt)
produkt_atrybut_wartosc(id, wartosc, id_produkt_atrybut, jezyk)

Czyli defacto robię ORDER BY na polu produkt_atrybut_wartosc.wartosc , gdzie atrybut.id jest równe np 3 (bo atrybut z id=3 to cena)

1

Kolumna po której jest order powinna być w głównej tabelce a nie dodatkowych, wtedy to i miliony rekordów możesz mieć i nie odczujesz tak radykalnego zmulenia.

0

Pokaż zapytanie.

0

Zapytanie na pastebin - żeby zachować formatowanie :)

http://pastebin.com/raw/1W4LUJDT

1

ten order by to porażka w tym zapytaniu, pomijając już całą resztę. Mogę ci powiedzieć, że wywalenie replaca już da bardzo dużo na wydajności. W ogóle cena powinna być trzymana jako liczba i już byś problemu w ogóle nie miał.

3

To nie ORDER BY jest problemem, tylko to, co się w nim dzieje... To jest zapytanie skorelowane, czyli aby posortować po nim, to musi najpierw wykonać to zapytanie tyle razy, ile jest rekordów w tabeli... Nie dziwię się, że to tyle trwa.

3

Najszybsza, choć nie najlepsza, metoda to sortować coś, co już zostało wybrane z bazy danych. W takim wypadku zapytanie dzielimy na dwa etapy. W pierwszym wybierasz wszystko, co cię interesuje, a w kolejnym sortujesz i ograniczasz.

https://4programmers.net/Pastebin/11331

Koledzy SQLowcy mnie za to pewno zjedzą, ale to jest najprostsza (pojęciowo) metoda.

1

@Koziołek: To nic nie da. I tak musi wykonać ileś tam (z tego co mówi TYSIĘCY) razy zapytanie skorelowane. To tyle trwa. Zapytanie jest całe do przepisania.

0

Dziękuję za wszystkie sugestie.
Baza niestety jest na tym etapie już nie do ruszenia. Pomijam fakt ilości danych - oprócz tego są integracje, które niestety na tej strukturze bazują. Przepisanie ich wiąże się tak na prawdę z postawieniem serwisu od nowa.

@Marcin.Miga gdybyś jednak znalazł troszkę wolnego czasu i zechciał skonstruować zapytanie z JOIN'ami to będę bardzo wdzięczny.

@mr_jaro jakby nie patrzyć cena to też atrybut.. Czysto hipotetycznie: czy przesunięcie jej (ceny) do tabeli produkt cokolwiek da? Indeksu nadal nie będzie.

1

@NewUser2k13 struktura bazy zawsze jest do ruszenia, nie oznacza, to, że to co jest obecnie się zmieni. Słyszałeś o nadmiarowości danych? Kopiowanie pewnych specjalnych wartości do innych tabel, tylko po to by zwiększyć wydajność kosztem większej zajętości miejsca.

Edit
Jeśli na tym etapie nie możesz ruszać bazy to znaczy, że coś architektonicznie ktoś zawalił i to nieźle.

0

Może zacznij czytać ten wątek:
Kurs SQL i optymalizacji Oracle

1
NewUser2k13 napisał(a):

@Marcin.Miga gdybyś jednak znalazł troszkę wolnego czasu i zechciał skonstruować zapytanie z JOIN'ami to będę bardzo wdzięczny.

Wrzuć próbkę danych tabel produkt_wartosc, kategoria,kategoria_produkt,produkt, atrybut, atrybut_wartosc na jakiegoś fiddle, to jak będę miał chwilę czasu dla relaksu, to się tym zajmę...

0

@mr_jaro - dzięki za sugestię. Pomogło. Teraz szuka w czasie rzeczywistym :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1