ďťż
 
[pgsql] zapytanie z offsetem ďťż
 
[pgsql] zapytanie z offsetem
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

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • autwywalczyl.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com