[pgsql] zapytanie z offsetem
croofec - 14-06-2006 02:58
[pgsql] zapytanie z offsetem
Witam,
robiac zapytanie explain analyze select * from test_offers limit 1 wynik otrzymuje bardzo szybko, zreszta to widać po explainie:
"Limit (cost=0.00..0.13 rows=1 width=622) (actual time=0.094..0.095 rows=1 loops=1)" " -> Seq Scan on test_offers (cost=0.00..10275.66 rows=81966 width=622) (actual time=0.090..0.090 rows=1 loops=1)" "Total runtime: 0.239 ms"
Natomiast robiac to samo zapytanie z ustawionym offsetem explain analyze select * from test_offers limit 1 offset 50000; mam "Limit (cost=6268.25..6268.37 rows=1 width=622) (actual time=742.372..742.373 rows=1 loops=1)" " -> Seq Scan on test_offers (cost=0.00..10275.66 rows=81966 width=622) (actual time=0.018..711.563 rows=50001 loops=1)" "Total runtime: 742.551 ms"
Wynik otrzymuje po troche dluzszym czasie. Widac ze w wyniku zapytania postgres zwraca 50001 a wyswietla tylko jeden. Czy jest możliwosc zoptymalizowania offsetu tak by przy 1000000000 offsecie nie bylo tak, ze czekam 10s na jeden rekord ?
-- Pozdrawiam, Marcin Łućko http:\\www.croofec.net
Bartek Siebab - 14-06-2006 02:58
> croofec w dniu 2006-06-13 11:50 pisze: > robiac zapytanie explain analyze select * from test_offers limit 1 > wynik otrzymuje bardzo szybko, zreszta to widać po explainie: -<>- > "Total runtime: 0.239 ms" > > Natomiast robiac to samo zapytanie z ustawionym offsetem > explain analyze select * from test_offers limit 1 offset 50000; > mam -<>- > "Total runtime: 742.551 ms" > > Wynik otrzymuje po troche dluzszym czasie. Widac ze w wyniku zapytania > postgres zwraca 50001 a wyswietla tylko jeden. Czy jest możliwosc > zoptymalizowania offsetu tak by przy 1000000000 offsecie nie bylo tak, > ze czekam 10s na jeden rekord ?
a masz na tej tabeli jakiś primary key?
-- ..---------- -------- ------ ---- ---- --- - -- - | Bartek `saphire` Siebab http://bartek.siebab.net
croofec - 14-06-2006 02:58
Bartek Siebab napisał(a): >> croofec w dniu 2006-06-13 11:50 pisze: > >> robiac zapytanie explain analyze select * from test_offers limit 1 >> wynik otrzymuje bardzo szybko, zreszta to widać po explainie: > > -<>- > >> "Total runtime: 0.239 ms" >> >> Natomiast robiac to samo zapytanie z ustawionym offsetem >> explain analyze select * from test_offers limit 1 offset 50000; >> mam > > -<>- > >> "Total runtime: 742.551 ms" >> >> Wynik otrzymuje po troche dluzszym czasie. Widac ze w wyniku zapytania >> postgres zwraca 50001 a wyswietla tylko jeden. Czy jest możliwosc >> zoptymalizowania offsetu tak by przy 1000000000 offsecie nie bylo tak, >> ze czekam 10s na jeden rekord ? > > > a masz na tej tabeli jakiś primary key? > Tak jest zrobiony primary key id_test int8 i jest na nim index jak to bywa na primary keyach
-- Pozdrawiam, Marcin Łućko http:\\www.croofec.net
=?iso-8859-2?Q?Andrzej_Str=F3=BFy=F1ski?= - 14-06-2006 02:58
Użytkownik "croofec" napisał: >>> ... >>> Czy jest możliwosc >>> zoptymalizowania offsetu tak by przy 1000000000 offsecie nie bylo tak, >>> ze czekam 10s na jeden rekord ? >> >> a masz na tej tabeli jakiś primary key? >> > Tak jest zrobiony primary key id_test int8 i jest na nim index jak to > bywa na primary keyach
a możesz użyć tego indeksu do wyszukania rekordu zamiast offsetu?
pozdrawiam A.S.
croofec - 14-06-2006 02:58
Andrzej Stróżyński napisał(a): > > Użytkownik "croofec" napisał: > >>>> ... >>>> Czy jest możliwosc >>>> zoptymalizowania offsetu tak by przy 1000000000 offsecie nie bylo tak, >>>> ze czekam 10s na jeden rekord ? >>> >>> >>> a masz na tej tabeli jakiś primary key? >>> >> Tak jest zrobiony primary key id_test int8 i jest na nim index jak to >> bywa na primary keyach > > > a możesz użyć tego indeksu do wyszukania rekordu zamiast offsetu? > > pozdrawiam > A.S. >
pewnie w tym przykladzie limit 1 sugeruje to, ale chodzi mi raczej o przegladanie wynikow tego selecta w postaci listy np 1 element czy tez 25 elementów z offsetem (tak jak np wyniki wyszukwania w google napewno klikajac na 123 podstrone otrzymam ja w tym samym czasie co pierwsza ) Jak osiagnac taki efekt ?
-- Pozdrawiam, Marcin Łućko http:\\www.croofec.net
croofec - 14-06-2006 02:58
croofec napisał(a): > Andrzej Stróżyński napisał(a): > >>Użytkownik "croofec" napisał: >> >> >>>>>... >>>>>Czy jest możliwosc >>>>>zoptymalizowania offsetu tak by przy 1000000000 offsecie nie bylo tak, >>>>>ze czekam 10s na jeden rekord ? >>>> >>>> >>>>a masz na tej tabeli jakiś primary key? >>>> >>> >>>Tak jest zrobiony primary key id_test int8 i jest na nim index jak to >>>bywa na primary keyach >> >> >>a możesz użyć tego indeksu do wyszukania rekordu zamiast offsetu? >> >>pozdrawiam >>A.S. >> > > > pewnie w tym przykladzie limit 1 sugeruje to, ale chodzi mi raczej o > przegladanie wynikow tego selecta w postaci listy np 1 element czy tez > 25 elementów z offsetem (tak jak np wyniki wyszukwania w google napewno > klikajac na 123 podstrone otrzymam ja w tym samym czasie co pierwsza ) > Jak osiagnac taki efekt ? > No dobra wyglupilem sie z googlem poniewaz wyszukiwarka zwraca max 1000 wynikow zapytania :/ (przyklad slowo: sex ;))
-- Pozdrawiam, Marcin Łućko http:\\www.croofec.net
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 14-06-2006 02:58
croofec wrote: > pewnie w tym przykladzie limit 1 sugeruje to, ale chodzi mi raczej o > przegladanie wynikow tego selecta w postaci listy np 1 element czy tez > 25 elementów z offsetem (tak jak np wyniki wyszukwania w google napewno > klikajac na 123 podstrone otrzymam ja w tym samym czasie co pierwsza ) > Jak osiagnac taki efekt ?
Moim zdaniem w prosty sposób tego nie zrobisz - żeby określić n+1 rekord, to trzeba najpierw znaleźć pierwszych n. Pomyślałbym nad: - samym zapytaniem (może da się je napisać lepiej i w ogóle nie będzie problemu?) - jakimś własnym indeksem do danych (pierwsze co mi przychodzi do głowy, to tabela zawierająca te same dane, ale już posortowane i ponumerowane; w Oracle widok zmaterializowany byłby do tego jak znalazł zapewne). oczywiście dla każdego wariantu zapytania i każdego możliwego sortowania musiałbyś mieć inny "indeks" - jakimś cachowaniem lub read-ahead (spodziewając się, że user kliknie "dalej" pobierasz za wczasu następną stronę)
No i mam nadzieję, że jesteś świadom, że w przypadku zapytania, które podałeś na samym początku, to równie dobrze możesz wywalić offset, bo nie ma tam żadnego ORDER BY, a zatem zapytanie i tak zwraca przypadkowy wiersz (co za różnica czy pierwszy przypadkowy, czy n-ty przypadkowy...).
-- Michał Kuratczyk
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 14-06-2006 02:58
Michał Kuratczyk wrote: > - jakimś własnym indeksem do danych (pierwsze co mi przychodzi do głowy > to tabela zawierająca te same dane, ale już posortowane i ponumerowane; > w Oracle widok zmaterializowany byłby do tego jak znalazł zapewne). > oczywiście dla każdego wariantu zapytania i każdego możliwego sortowania > musiałbyś mieć inny "indeks" To rozwiązanie oczywiście ma sens tylko w przypadku danych (niemal) wyłącznie do odczytu, bo inaczej koszt tworzenia tych gotowych zestawów wyników będzie większy niż korzyści z ich posiadania.
-- Michał Kuratczyk
croofec - 14-06-2006 02:58
Michał Kuratczyk napisał(a): > Michał Kuratczyk wrote: > >>- jakimś własnym indeksem do danych (pierwsze co mi przychodzi do głowy >> to tabela zawierająca te same dane, ale już posortowane i ponumerowane; >> w Oracle widok zmaterializowany byłby do tego jak znalazł zapewne). >> oczywiście dla każdego wariantu zapytania i każdego możliwego sortowania >> musiałbyś mieć inny "indeks" > > To rozwiązanie oczywiście ma sens tylko w przypadku danych (niemal) > wyłącznie do odczytu, bo inaczej koszt tworzenia tych gotowych zestawów > wyników będzie większy niż korzyści z ich posiadania. > Dziekuje za wyczerpujaca odpowiedz. -- Pozdrawiam, Marcin Łućko http:\\www.croofec.net
Grzegorz - 18-06-2006 00:44
Witam,
croofec napisał(a): > Witam, > > robiac zapytanie explain analyze select * from test_offers limit 1 > wynik otrzymuje bardzo szybko, zreszta to widać po explainie:
Nie mam PostgreSQL-a pod reka, wiec nie moge sprawdzic wartosci mojej rady, ale: * jezeli wyszukujesz po indeksowanej kolumnie, * masz w zapytaniu klauzule ,,order by'' * wiesz jakie kolumny ma zwrocic zapytanie,
to sprobowalbym EXCEPT (szczegoly w dokumentacji):
SELECT pole1, pole2, pole3 FROM test_offers ORDER BY pole1 LIMIT 50025 EXCEPT SELECT pole1, pole2, pole3 FROM test_offers ORDER BY pole1 LIMIT 50000
Jezeli powyzsze nie zadziala, to sprobuj podzapytan:
SELECT pole1, pole2, pole3 FROM (SELECT pole1, pole2, pole3 FROM test_offers ORDER BY pole1 LIMIT 50025) as x1 EXCEPT SELECT pole1, pole2, pole3 FROM (SELECT pole1, pole2, pole3 FROM test_offers ORDER BY pole1 LIMIT 50000) AS x2 ORDER BY pole1
Wynikami pochwal sie na grupie.
Zapewne masz w tym zapytaniu jakies warunki wyszukiwania, wartosci LIMIT zmieniaja sie, wiec, jezeli rada okaze sie dobra, to owin to zapytanie w funkcje i wolaj funkcje:
SELECT nextRecordset(3, warunek1, null);
A funkcja niech juz juz sobie wyliczy wlasciwa wartosc limitu dla trzeciej paczki danych oraz zbuduje odpowiednie zapytanie na podstawie argumentow funkcji (na przyklad z uzyciem IF-a i CASE).
-- Grzegorz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
[MySQL]: Dodanie zliczania =?ISO-8859-2?Q?rekord=F3w_do_rozb?==?ISO-8859-2?Q?udowanego_zapytania?=
zanotowane.pldoc.pisz.plpdf.pisz.plautwywalczyl.opx.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 |
|