ORDER BY na bardzo dużej bazie danych

Odpowiedz Nowy wątek
2019-08-05 19:57
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ę :)

Pozostało 580 znaków

2019-08-06 17:42

@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.

edytowany 1x, ostatnio: mr_jaro, 2019-08-06 17:44
myślę, że na etapie projektowania nikt nie spodziewał się tak rozbudowanej struktury :) Zaczęło się od zwykłego serwisu, gdzie wszystko "wkładane" było ręcznie, a po latach wyrósł twór, który żyje sam dzięki integracji plików xml 'ze świata' - NewUser2k13 2019-08-06 17:48
@NewUser2k13: ale co to zmienia? Sam obecnie robię optymalizację w bazie w serwisie który powstał 5-6 lat temu i przy obecnym ruchu i milionach rekordów nie wyrabia. W 8h pracy zwiększyłem wydajność krytycznych miejsc o 70% a wystarczyło dodać trochę nadmiarowych danych + indexy. - mr_jaro 2019-08-06 17:50
Reasumując. Co wg Twojej opinii najbardziej zwiększy wydajność? Jeśli mogę prosić, to chciałbym konkrety - np "wyciąg cenę z atrybutów i utwórz dla niej nową tabelę" ;) - NewUser2k13 2019-08-06 17:53
zakładam, że masz główną tabelkę "products" od której całe zapytanie się zaczyna, ja bym zrobił nadmiarową kolumnę int "price" (w groszach) która by zawierała cenę wykorzystywaną przy sortowaniu. - mr_jaro 2019-08-06 17:55
@mr_jaro dziękuję za sugestię. Postawię bazę kopię obecnej i potestuję. Jeszcze pytanie o typ danych - rozumiem, że INT będzie szybciej "przetwarzany" od chociażby FLOAT? I jeszcze pytanie z innej beczki... Jak wg was, powinna wyglądać struktura bazy w tym przypadku? Do każdego produktu jest 250 atrybutów (co prawda nie wszystkie uzupełnione) ale jest możliwość szukania po każdej z tej wartości (oraz łączenie wartości)? - NewUser2k13 2019-08-06 18:05
@NewUser2k13: tak, int jest szybszy - mr_jaro 2019-08-06 20:05

Pozostało 580 znaków

2019-08-06 18:55
0

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

Pozostało 580 znaków

2019-08-06 20:20
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ę...

Pozostało 580 znaków

2019-08-09 19:31
0

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

Proszę bardzo ;) - mr_jaro 2019-08-09 19:33

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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