ďťż
 
[postgres 8.x] Wolny tsearch ? ďťż
 
[postgres 8.x] Wolny tsearch ?
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[postgres 8.x] Wolny tsearch ?



mechcinski@tlen.pl - 12-11-2006 00:38
[postgres 8.x] Wolny tsearch ?
  Witam, mam maly problem z optymalizacja bazy i zastanawiam sie czy
powinienem sie rozgladac za wlasnym serwerem czy moze uda mi sie
pociagnac to na czym stoi(wirtual - juz nie wiem ktory z kolei......)
Kluczowa tabela(400tys rekordow) "opisy" - ma kolumny : id,
opis(text).
W kolumnie 'opis' trzymam angielskojezyczne slowa kluczowe opisujace
zdjecia - przyklad: 'young beauty woman flower hand close-up', w jednym
opisie jest od kilkunastu do kilkudziesieciu slow kluczowych.
Najbardziej wydajnym rozwiazaniem okazl sie byc tsearch.
Indeksuje slowa-UPDATE opisy SET idxFTI=to_tsvector('default', opis);
zakladam index : CREATE INDEX idxFTI_idx ON opisy USING gist(idxFTI); -
czyli standardowo....
Oprocz tego mam tabele "foto" z pozostalymi informacjami o zdejcciach w
kilku kolumnach, rzecz jasna rekordow tyle samo, rozmiary: foto 280Mb
opisy 420Mb...
Moje pierwsze zdziwienie to rozniece w czasach dla zapytan:
select count(*) from foto - 2 sekundy
select count(*) from opisy - 20 sekund - pojecia nie mam skad takie
rozbierznosci ...przeciez ilosc rekordow jest ta sama ...

Wracajac do tsearcha - o ile zapytanie zwracajace porcje wynikow(i tu
sie nie dziwie ze dziala szybko):
SELECT id FROM opisy
WHERE idxfti @@ to_tsquery('default', 'summer & flower')
limit 100;
- ponizej sekundy
o tyle zapytanie zwracajace ilosc wszystkich pasujacych rekordow
SELECT count(*) FROM opisy
WHERE idxfti @@ to_tsquery('default', 'summer &
flower');
trwa juz bardzo dlugo....20-30 sekund dla zliczonych rekordow
stanowiacych >10% wszystkich....

Czy sam tseach dostarcza jakies procedury zliczajace - nie sadze...
A moze zajac sie konfiguracja tseracha , slowniki itd - ale tez nie
wydaje mi sie...
Czy da sie ta baze jescze w jakis sposob zoptymalizowac - nie sadze ...
Czy musze szukac maszyny - tak mi sie wydaje....

Pozdrawima
Mec





Wojtek pBT - 12-11-2006 01:29

  Dnia 22-09-2006 o 21:15:19 <mechcinski@tlen.pl> napisał(a):

> Moje pierwsze zdziwienie to rozniece w czasach dla zapytan:
> select count(*) from foto - 2 sekundy
> select count(*) from opisy - 20 sekund - pojecia nie mam skad takie
> rozbierznosci ...przeciez ilosc rekordow jest ta sama ...
>

Twoje zdziwienie wynika z niedoczyania. W postgres nie warto używać do
testów count(*) bo jest bardzo nie miarodajne - a może właśnie
miarodajne... SQL musi sobie zliczyć wszystkie rekordy. I z nieznanych mi
powodów Postgres robi to wyjątkowo powolnie...

Nie jestem na super bierząco - ale raczej trudno to będzie bardziej
zoptymalizować... Możesz albo pokazywać: strona 1 2 ... AS kolejne albo
zmienić silnik

pozdro, pBT

--
Używam klienta poczty Opera Mail: http://www.opera.com/mail/




Bartek Siebab - 12-11-2006 01:30

  > Dnia 22-09-2006 o 21:15:19 <mechcinski@tlen.pl> napisał(a):
>
>
>> Moje pierwsze zdziwienie to rozniece w czasach dla zapytan:
>> select count(*) from foto - 2 sekundy
>> select count(*) from opisy - 20 sekund - pojecia nie mam skad takie
>> rozbierznosci ...przeciez ilosc rekordow jest ta sama ...

A sprawdź jak będzie gdy ten count puścisz na pole z kluczem głównym
select count(polezkluczemglownym) from opisy;

--
..---------- -------- ------ ---- ---- --- - -- -
| Bartek `saphire` Siebab http://bartek.siebab.net




Paweł Matejski - 12-11-2006 01:30

  mechcinski@tlen.pl wrote:
> Witam, mam maly problem z optymalizacja bazy i zastanawiam sie czy
> powinienem sie rozgladac za wlasnym serwerem czy moze uda mi sie
> pociagnac to na czym stoi(wirtual - juz nie wiem ktory z kolei......)
> Kluczowa tabela(400tys rekordow) "opisy" - ma kolumny : id,
> opis(text).
> W kolumnie 'opis' trzymam angielskojezyczne slowa kluczowe opisujace
> zdjecia - przyklad: 'young beauty woman flower hand close-up', w jednym
> opisie jest od kilkunastu do kilkudziesieciu slow kluczowych.
> Najbardziej wydajnym rozwiazaniem okazl sie byc tsearch.
> Indeksuje slowa-UPDATE opisy SET idxFTI=to_tsvector('default', opis);
> zakladam index : CREATE INDEX idxFTI_idx ON opisy USING gist(idxFTI); -
> czyli standardowo....
> Oprocz tego mam tabele "foto" z pozostalymi informacjami o zdejcciach w
> kilku kolumnach, rzecz jasna rekordow tyle samo, rozmiary: foto 280Mb
> opisy 420Mb...
> Moje pierwsze zdziwienie to rozniece w czasach dla zapytan:
> select count(*) from foto - 2 sekundy
> select count(*) from opisy - 20 sekund - pojecia nie mam skad takie
> rozbierznosci ...przeciez ilosc rekordow jest ta sama ...

Daj explain tych zapytań.

--
P.M.





herakles - 12-11-2006 01:30

  mechcinski@tlen.pl wrote:

> Witam, mam maly problem z optymalizacja bazy i zastanawiam sie czy
> powinienem sie rozgladac za wlasnym serwerem czy moze uda mi sie
> pociagnac to na czym stoi(wirtual - juz nie wiem ktory z kolei......)
> Kluczowa tabela(400tys rekordow) "opisy" - ma kolumny : id,
> opis(text).
> W kolumnie 'opis' trzymam angielskojezyczne slowa kluczowe opisujace
> zdjecia - przyklad: 'young beauty woman flower hand close-up', w jednym
> opisie jest od kilkunastu do kilkudziesieciu slow kluczowych.
> Najbardziej wydajnym rozwiazaniem okazl sie byc tsearch.
> Indeksuje slowa-UPDATE opisy SET idxFTI=to_tsvector('default', opis);
> zakladam index : CREATE INDEX idxFTI_idx ON opisy USING gist(idxFTI); -
> czyli standardowo....
> Oprocz tego mam tabele "foto" z pozostalymi informacjami o zdejcciach w
> kilku kolumnach, rzecz jasna rekordow tyle samo, rozmiary: foto 280Mb
> opisy 420Mb...
> Moje pierwsze zdziwienie to rozniece w czasach dla zapytan:
> select count(*) from foto - 2 sekundy
> select count(*) from opisy - 20 sekund - pojecia nie mam skad takie
> rozbierznosci ...przeciez ilosc rekordow jest ta sama ...
Kiedyś odkryłem, że wszelkie operacje na tabelach w których jest dużo
danych(pole z długim opisem, pole z plikiem) w prostgrasie są bardzo
powolne jeśli nie używamy do identyfikacji rekordów primary keja albo
indeksu po innych polach, tzn. select count(pole_primary_key) będzie
szybki.

>
> Wracajac do tsearcha - o ile zapytanie zwracajace porcje wynikow(i tu
> sie nie dziwie ze dziala szybko):
> SELECT id FROM opisy
> WHERE idxfti @@ to_tsquery('default', 'summer & flower')
> limit 100;
> - ponizej sekundy
> o tyle zapytanie zwracajace ilosc wszystkich pasujacych rekordow
> SELECT count(*) FROM opisy
> WHERE idxfti @@ to_tsquery('default', 'summer &
> flower');
Bez sensu!!!
Robić dwa razy to samo.

dobrze jest stworzyć tabelkę, trzymającą wyniki zapytań i ją trigerować.

Zrób tak:
SELECT id into temp tymczas_id FROM opisy
WHERE idxfti @@ to_tsquery('default', 'summer & flower')
limit 100;

I teraz select count(id) from tymczas_id;
Oraz
select o.* from opisy o inner join tymczas_id t on t.id=o.id ...

To powinno śmiagać, oczywiście w przypadku gdy jest tam limit 100, jeśli
natomiast limit będzie dużo większy, to aby śmigało proponuje założyć
indeks na tabeli tymczasowej, albo z palca zrobić:
CREATE TEMP TABLE tymczas_id(.....
i zamiast: SELECT id into temp tymczas_id FROM opisy
WHERE idxfti @@ to_tsquery('default', 'summer & flower');
zrobić: insert into tymczas_id SELECT id FROM opisy
WHERE idxfti @@ to_tsquery('default', 'summer & flower');
CREATE INDEX .... na tymczas_id

Ważne indeks robić po tym insercie.
> trwa juz bardzo dlugo....20-30 sekund dla zliczonych rekordow
> stanowiacych >10% wszystkich....
>
> Czy sam tseach dostarcza jakies procedury zliczajace - nie sadze...
> A moze zajac sie konfiguracja tseracha , slowniki itd - ale tez nie
> wydaje mi sie...
> Czy da sie ta baze jescze w jakis sposob zoptymalizowac - nie sadze ...
Chcieć to móc, a móc to chcieć.

> Czy musze szukac maszyny - tak mi sie wydaje....
>
> Pozdrawima
> Mec
Wisisz mi flaszkę.




mechcinski@tlen.pl - 12-11-2006 01:31

  Jesli chodzi o zliczanie po zindexowanej kolumnie - racja spora
poprawa.

herakles wrote:

> Bez sensu!!!
> Robić dwa razy to samo.
>
> dobrze jest stworzyć tabelkę, trzymającą wyniki zapytań i ją trigerować.
>
> Zrób tak:
> SELECT id into temp tymczas_id FROM opisy
> WHERE idxfti @@ to_tsquery('default', 'summer & flower')
> limit 100;
> I teraz select count(id) from tymczas_id;
> Oraz
> select o.* from opisy o inner join tymczas_id t on t.id=o.id ...

Tu sie raczej nie zrozumielismy...wyswietlajac wyniki wyszukiwania
pokazuje tez ich ilosc.
Wiec musze policzyc calosc wynikow i wyswitlic ich czesc..

> To powinno śmiagać, oczywiście w przypadku gdy jest tam limit 100, jeśli
> natomiast limit będzie dużo większy, to aby śmigało proponuje założyć
> indeks na tabeli tymczasowej, albo z palca zrobić:
> CREATE TEMP TABLE tymczas_id(.....
> i zamiast: SELECT id into temp tymczas_id FROM opisy
> WHERE idxfti @@ to_tsquery('default', 'summer & flower');
> zrobić: insert into tymczas_id SELECT id FROM opisy
> WHERE idxfti @@ to_tsquery('default', 'summer & flower');
> CREATE INDEX .... na tymczas_id
>
> Ważne indeks robić po tym insercie.

Idac tym tropem - mozna zakladac indeksy na tabeli tymczasowej ?
Jesli jednak mozna - wrzucenie wynikw do tabeli, zalozenie ne tej
tabeli indeksu, zliczenie rekordow tej tabeli bedzie szybsze ????

> Chcieć to móc, a móc to chcieć.

hehe lepsze to niz "jak sie nie ma co sie lubi to sie lubi co sie ma
".....

> Wisisz mi flaszkę.
mam gest - ballantines dla Ciebie

Mam wrazenie ze doszedelem do granicy wydajnosciowej maszyny i
postgresa...
Kiedys Ronald Kuczek zaproponowal na grupie (http://tinyurl.com/roarn)
rozwiazenie:
swish-e.
Wyszukiwanie pelnotekstowe oferowane przez tsearcha wysiada.Sprawdzone
- ten sam sprzet te saeme dane - postgres niestety wolnijeszy kilkaset
razy...

Tylko zastanawiam sie...o ile wyszukanie za pomoca swish-e jest malo
kosztowne, o tyle wrzucenie do postgresa z "zewnatrz" powiedzmy 30tys
identyfikatorow + join na tej tabeli to juz swoje kosztuje ?

Mec




herakles - 12-11-2006 01:31

  mechcinski@tlen.pl wrote:

> Jesli chodzi o zliczanie po zindexowanej kolumnie - racja spora
> poprawa.
>
> herakles wrote:
>
>> Bez sensu!!!
>> Robić dwa razy to samo.
>>
>> dobrze jest stworzyć tabelkę, trzymającą wyniki zapytań i ją trigerować.
>>
>> Zrób tak:
>> SELECT id into temp tymczas_id FROM opisy
>> WHERE idxfti @@ to_tsquery('default', 'summer & flower')
>> limit 100;
>> I teraz select count(id) from tymczas_id;
>> Oraz
>> select o.* from opisy o inner join tymczas_id t on t.id=o.id ...
>
> Tu sie raczej nie zrozumielismy...wyswietlajac wyniki wyszukiwania
> pokazuje tez ich ilosc.
> Wiec musze policzyc calosc wynikow i wyswitlic ich czesc..
to wywal limit, tylko uważaj na szukanie spacji itp.

>
>> To powinno śmiagać, oczywiście w przypadku gdy jest tam limit 100, jeśli
>> natomiast limit będzie dużo większy, to aby śmigało proponuje założyć
>> indeks na tabeli tymczasowej, albo z palca zrobić:
>> CREATE TEMP TABLE tymczas_id(.....
>> i zamiast: SELECT id into temp tymczas_id FROM opisy
>> WHERE idxfti @@ to_tsquery('default', 'summer & flower');
>> zrobić: insert into tymczas_id SELECT id FROM opisy
>> WHERE idxfti @@ to_tsquery('default', 'summer & flower');
>> CREATE INDEX .... na tymczas_id
>>
>> Ważne indeks robić po tym insercie.
>
> Idac tym tropem - mozna zakladac indeksy na tabeli tymczasowej ?
TAK i z wolnej spuchniętej tabeli tymczaoswej, robi się zaje.. szybka
zmienna do obliczeń.
> Jesli jednak mozna - wrzucenie wynikw do tabeli, zalozenie ne tej
> tabeli indeksu, zliczenie rekordow tej tabeli bedzie szybsze ????
tak, bo znalazłeś powiedzmy 1000 wyników, wrzucasz je do tabeli tymczasowej
i już takie rzeczy jak county, czy kolejne wyświetlanie kolejnych wyników
robisz już na tej tabeli nie wyszukując za każdym razem bo już masz
wyszukane.

>
>
>> Chcieć to móc, a móc to chcieć.
>
> hehe lepsze to niz "jak sie nie ma co sie lubi to sie lubi co sie ma
> ".....
>
>> Wisisz mi flaszkę.
> mam gest - ballantines dla Ciebie
To jeszcze łinstony i łintermensy poproszę.

>
> Mam wrazenie ze doszedelem do granicy wydajnosciowej maszyny i
> postgresa...
Nie zawsze gdzieś się da coś przekopać i przyśpieszyć, w tej bazie, tylko
trzeba wykombinować jak. Natomiast problemem trudnym do załatwienia będzie
przyśpieszenie samego tserach, wtedy za to możesz spróbować zastosować
inny, mniej kobylasty.

> Kiedys Ronald Kuczek zaproponowal na grupie (http://tinyurl.com/roarn)
> rozwiazenie:
> swish-e.
> Wyszukiwanie pelnotekstowe oferowane przez tsearcha wysiada.Sprawdzone
> - ten sam sprzet te saeme dane - postgres niestety wolnijeszy kilkaset
> razy...
>
> Tylko zastanawiam sie...o ile wyszukanie za pomoca swish-e jest malo
> kosztowne, o tyle wrzucenie do postgresa z "zewnatrz" powiedzmy 30tys
> identyfikatorow + join na tej tabeli to juz swoje kosztuje ?
Samo wrzucenie może być bardzo kosztowne w przypadku 30 000 i inserta, ale
postgres ma inną lepszą metodę, mianowicie copy, a jeśli chodzi o
szczegółowy insert, to można zrobić copy do temp tabeli, a potem insert
into ... select ... from temp_tabela




mechcinski@tlen.pl - 12-11-2006 01:32

  herakles wrote:
> > Jesli jednak mozna - wrzucenie wynikw do tabeli, zalozenie ne tej
> > tabeli indeksu, zliczenie rekordow tej tabeli bedzie szybsze ????
> tak, bo znalazłeś powiedzmy 1000 wyników, wrzucasz je do tabeli tymczasowej
> i już takie rzeczy jak county, czy kolejne wyświetlanie kolejnych wyników
> robisz już na tej tabeli nie wyszukując za każdym razem bo już masz
> wyszukane.
najbardziej czasochlonne jest zliczanie wszystkich wynikow,
wyszukiwanie porcji wynikow dziala szybko...

> Nie zawsze gdzieś się da coś przekopać i przyśpieszyć, w tej bazie, tylko
> trzeba wykombinować jak. Natomiast problemem trudnym do załatwienia będzie
> przyśpieszenie samego tserach, wtedy za to możesz spróbować zastosować
> inny, mniej kobylasty.
Jesli jest jakis fulltext do postgresa oprocz tsearcha - chetnie
potestuje. Znasz jaksi ?

Pozdrawiam
Mec
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?= postgresql - int/int postgresql Select count(*) czy raczej Select count(ID) [PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?= [postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?= [postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?= [PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?= Postgres - replikcja master-master Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL] Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • natalia97.htw.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com