Warsztat - Programowanie gier

Lipiec 30, 2010, 17:31:39 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: 1 [2]
  Drukuj  
Autor Wątek: kilkukrotny join dużych tabel  (Przeczytany 5757 razy)
shyha
SuperHero Member
******

wiadomości: 1281


wonteg, jakie devicy targetujesz? sierodek...


Zobacz profil WWW
« Odpowiedz #15 : Sierpień 24, 2006, 15:28:01 »

a może to być kwestia szybkości odczytu dysku?
Ten parametr jest jednym z najbardziej kluczowych Smiley
Dodam tylko, że nie jestem ekspertem w tuningu baz danych Sad
Zapisane


Shyha@Flickr
'Of all the paths you choose in life, make sure some of them are dirt'
bies
Gość
« Odpowiedz #16 : Sierpień 24, 2006, 15:48:03 »

Załóżmy, że struktura jest taka jak podał Shyha. Załóżmy, że jedyny indeks jest na polu ,,slowo''. Spróbuj tak:
Kod:
Select
        id_dok,
        slowo
from indeks
where
        slowo in (slowo_1, ..., slowo_n)
order by id_dok
A następnie przejdź kursorem (albo po stronie bazy - PostreSQL ma jakiś odpowiednik PLSQL-a, albo po stronie aplikacji) i wybierz tylko te id o odpowiedniej liczności.

// edit
Aha, IMO wyszukiwanie dokumentów po słowach kluczowych to zdecydowanie nie domena relacyjnej bazy danych - tu bardziej przydaje się struktura drzewa (grafu). Może użyj jakiejś dedykowanej biblioteki (np. Lucene).
« Ostatnia zmiana: Sierpień 24, 2006, 15:50:03 wysłane przez bies » Zapisane
Goliatus
Hero Member
*****

wiadomości: 975


Zobacz profil
« Odpowiedz #17 : Sierpień 24, 2006, 15:57:08 »

Jeśli jedyny indeks jest na "słowo" to sortowanie po id_dok również da zły efekt.

Cytuj
Aha, IMO wyszukiwanie dokumentów po słowach kluczowych to zdecydowanie nie domena relacyjnej bazy danych - tu bardziej przydaje się struktura drzewa (grafu). Może użyj jakiejś dedykowanej biblioteki (np. Lucene).
No tak ale to nie tylko przeszukiwanie tekstu, ale również przeszukiwanie obiektów o różnych parametrach. Zamiast robić 100 tabel dla każdej kategorii obiektów, zrobiłem jedną:
(id_obiekt, id_typ_parametru, wartosc)

Nie wiem czy to wlasciwy sposob uzywania baz danych, ale uproscilo to wiele spraw.
Zapisane
shyha
SuperHero Member
******

wiadomości: 1281


wonteg, jakie devicy targetujesz? sierodek...


Zobacz profil WWW
« Odpowiedz #18 : Sierpień 24, 2006, 15:59:33 »

Jeśli jedyny indeks jest na "słowo" to sortowanie po id_dok również da zły efekt.
Nie - po prostu odfiltruje przy użyciu indeksu. Bies dał ci rozwiązanie, w którym wyznaczenie liczności rekordów i filtrowanie po niej zrzucone są na twoje barki Smiley


// edit: aaaaaaaaaaaaa inne pola Smiley myślałem, że chodzi o to samo Smiley
« Ostatnia zmiana: Sierpień 24, 2006, 22:15:57 wysłane przez shyha » Zapisane


Shyha@Flickr
'Of all the paths you choose in life, make sure some of them are dirt'
Goliatus
Hero Member
*****

wiadomości: 975


Zobacz profil
« Odpowiedz #19 : Sierpień 24, 2006, 16:07:05 »

No ale jaka gwarancja, że to sortowanie bez używania jakiegoś indeksu nie zamuli?
Zapisane
bies
Gość
« Odpowiedz #20 : Sierpień 24, 2006, 16:15:41 »

Jeśli jedyny indeks jest na "słowo" to sortowanie po id_dok również da zły efekt.
Tak, mea culpa, indeks na id_dok też się pewnie przyda. Czyli potrzebne będą raczej dwa indeksy. Poza tym, sprawdź. ;P

// edit
Może warto nawet zrobić CLUSTER (tj. robić co jakiś czas) po tym indeksie.
« Ostatnia zmiana: Sierpień 24, 2006, 16:19:40 wysłane przez bies » Zapisane
Goliatus
Hero Member
*****

wiadomości: 975


Zobacz profil
« Odpowiedz #21 : Sierpień 24, 2006, 16:17:39 »

no sprawdziłem działa dobrze(filtrowanie we własnym zakresie pozwoli na pokazywanie wyników na bieżąco, o co w sumie mi chodziło), indeks na id_dok jest, ale nie jest używany
Zapisane
bies
Gość
« Odpowiedz #22 : Sierpień 24, 2006, 16:26:27 »

Ok, jeśli miałbyś trochę czasu to spróbuj zrobić to tak.
1) Stwórz dwie tabele, jedną fizycznie posortowaną (cluster), drugą bez indeksu (skoro działa dobrze - trochę się zdziwiłem, spodziewałem się raczej, że indeks będzie pomocny).
2) Bieżące dane wpisuj do drugiej.
3) W ,,trybie nocnego przetwarzania'' przerzucaj dane z drugiej do pierwszej i znowu cluster.
4) Wyszukuj w obu w ten sam sposób a w programie imperatywnym przejdź dwoma kroczącymi kursorami - b. prosty i szybki algorytm.

// edit
A w ogóle zobacz ,,Notes'' w dokumentacji do CLUSTER - tam jest ciekawy mechanizm który może w ogóle wyeliminować sortowanie z pierwszej tabeli.
« Ostatnia zmiana: Sierpień 24, 2006, 16:32:31 wysłane przez bies » Zapisane
Reg
Member2000
*******

wiadomości: 3791



Zobacz profil WWW
« Odpowiedz #23 : Sierpień 27, 2006, 20:55:34 »

Skoro to ma być wyszukiwanie słów kluczowych, to nie myślałeś może, żeby spróbować indeksów pełnotekstowych?
Zapisane

Goliatus
Hero Member
*****

wiadomości: 975


Zobacz profil
« Odpowiedz #24 : Wrzesień 01, 2006, 15:33:36 »

Poczytałem troche o tsearch2, że ludzie mają z tym wydajnościowe problemy, a że nie dysponuje super sprzętem to wolę nie ryzykować i sklecic samemu coś prostszego.
Zapisane
JCoder
Sr. Member
****

wiadomości: 277


Zobacz profil
« Odpowiedz #25 : Kwiecień 22, 2008, 13:55:11 »

Przekombinowujecie Cheesy
CLUSTER tabela_idx_b ON tabela_b;

Powinno przyspieszyć o rząd wielkości.

 
Zapisane

Being really good at C++ is like being really good at using rocks to sharpen sticks. -- Thant Tessman
skowronkow
Jr. Member
**

wiadomości: 95

get it done


Zobacz profil WWW
« Odpowiedz #26 : Czerwiec 02, 2008, 17:00:41 »

nie mowiac juz o tym ze jak napisal bies jest to typowe zastosowanie fulltext search... ale staruski temat;p
Zapisane

gid
Strony: 1 [2]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC