2010/11/25 Emil J. <eak...@gmail.com>:
> Pozdravujem,Když není po ruce už nic jiného. Když výsledný dotaz oříznete na
>
> mozem sa opytat, ze na co sa teda pouziva ten OFFSET, ked na tuto vec nie
> je vhodny ?
>
serveru, tak je to řádově rychlejší než na straně klienta - radikálně
to redukuje objem přenesených dat. Bez problémů se nechá použít pro
jednorázové operace. Používá se pro eliminaci maximálních hodnot.
Např. MySQL nepodporuje kurzory, tudíž pokud chcete pracovat s
extrémně velkou tabulkou tak Vám nic jiného nezbude, než použít
OFFSET. V PostgreSQL ale kurzory jsou - což je extrémně užitečný
nástroj, když na klientu zpracováváte několika miliónové a větší
tabulky.
Rozhodně ale tato klauzule nebyla určena pro podporu stránkování - a
to, že OFFSETem lze stránkování řešit, zdaleka neznamená, že je to
optimální řešení (záleží na zatížení serveru, objemu dat, designu
aplikace). Většinou je výhodnější použít cache a nějakým způsobem
limitovat velikost výsledku. Neznám uživatele, který by se důkladně
věnoval datům a proklikal se na 100 stránku, natož pak na 1000.
Pavel
p.s. rada klauzulí v SQL je "k ničemu" - resp. jejích smysl a účel je
diskutabilní - např. NATURAL JOIN. CROSS JOIN, který se dříve docela
používal dneska až na výjimky lze většinou nahradit efektivnější
konstrukcí, ...
> Dakujem,
> Emil.
>
> 2010/11/25 Pavel Stehule <pavel....@gmail.com>
>>
>> 2010/11/25 Pavel Arnošt <id98...@gmail.com>:
>> > Zdravím,
>> >
>> > dotaz:
>> >
>> > SELECT id FROM reading ORDER BY timestamp OFFSET 125000 LIMIT 50
>> >
>> > jde docela pomalu, u mě na Win32/9.0.1 kolem 7-mi vteřin. Je to
>> > normální? Jde s tím něco dělat?
>> >
>> > Plán vypadá takhle:
>> >
>> > "Limit (cost=262611.53..262716.58 rows=50 width=209)"
>> > " -> Index Scan using reading_timestamp on reading
>> > (cost=0.00..8349830.29 rows=3974421 width=209)"
>> >
>> > Čím větší OFFSET, tím je to horší. A třeba u OFFSETu 500000 se změní i
>> > plán na:
>> >
>> > "Limit (cost=1004610.22..1004610.35 rows=50 width=209)"
>> > " -> Sort (cost=1003360.22..1013296.27 rows=3974421 width=209)"
>> > " Sort Key: "timestamp""
>> > " -> Seq Scan on reading (cost=0.00..160181.21 rows=3974421
>> > width=209)"
>> >
>> > a dotaz pak trvá 214 vteřin.
>> >
>> > Myslel jsem si že díky indexu bude dotaz magicky a rychle fungovat,
>> > ale něco mi uniká..
>>
>> Však se můžete přesvědčit, že s indexem dotaz trvá cca 7 sec a bez něj
>> 214. To, co Vám uniká, je pochopení jak funguje OFFSET a LIMIT. Tyto
>> klauzule (většinou) pouze seříznou výsledek dotazu. Klauzule OFFSET
>> samotný dotaz nijak neurychlí - OFFSET 0 LIMIT 50 -> po prvních 50
>> řádcích ukonči dotaz, OFFSET 10000 LIMIT 50 znamená, generuj 10050
>> řádků, prvních 10000 zahoď a klientu pošli 50 řádků. To je šíleně
>> neefektivní a samozřejmě, se zvyšujícím offsetem se dotaz zpomaluje.
>>
>> Před 2 lety jsem napsal bulvární článek do roota jak špatné je
>> používat LIKE. Mám pocit, že teď už tou špatnou klauzulí v SQL je
>> OFFSET :).
>>
>> Úplně by postačilo, kdybyste si pamatoval poslední hodnotu z předchozí
>> stránky - tj. místo offsetu napíšete
>>
>> SELECT FROM tab WHERE id > last_id ORDER BY id LIMIT 50.
>>
>> Další možností je použití kurzoru na straně serveru - díky kterému
>> můžete ze serveru sekvenčně odebírat bloky dat, aniž byste musel
>> opakovaně provádět dotaz. Nevím, proč děláte, to co děláte - jestli
>> stránkování www aplikace, tak to máte určitě nevhodně navržené - ani
>> google - a ten má rychlé stroje, a data v paměti Vám neumožní skočit
>> na 1000 stránku přímo.
>>
>> Pavel
>>
>> >
>> > Díky,
>> > S pozdravem
>> > Pavel Arnošt
>> >
>> > --
>> > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
>> > PostgreSQL-cz ve Skupinách Google.
>> > Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
>> > postgr...@googlegroups.com.
>> > Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
>> > postgresql-c...@googlegroups.com.
>> > Další možnosti lze nastavit při návštěvě skupiny na stránce
>> > http://groups.google.com/group/postgresql-cz?hl=cs.
>> >
>> >
>>
>> --
>> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
>> PostgreSQL-cz ve Skupinách Google.
>> Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
>> postgr...@googlegroups.com.
>> Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
>> postgresql-c...@googlegroups.com.
>> Další možnosti lze nastavit při návštěvě skupiny na stránce
>> http://groups.google.com/group/postgresql-cz?hl=cs.
>>
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> PostgreSQL-cz ve Skupinách Google.
> Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
> postgr...@googlegroups.com.
> Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
> postgresql-c...@googlegroups.com.
> Další možnosti lze nastavit při návštěvě skupiny na stránce
> http://groups.google.com/group/postgresql-cz?hl=cs.
>
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu postgr...@googlegroups.com.
Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu postgresql-c...@googlegroups.com.
Další možnosti lze nastavit při návštěvě skupiny na stránce http://groups.google.com/group/postgresql-cz?hl=cs.
nikdy jsem to nepotřeboval ale letmým pohledem do dokumentace se mi zdá že
by to mělo jít například funkcí "xpath" - viz.
http://www.postgresql.org/docs/9.0/interactive/functions-xml.html
a dokonce si na tom můžete udělat index.
Tomáš
> Chcel by som sa este nieco opytat.
> Zatial len v teoretickej rovine - mal by som takuto tabulku:
>
> *ID* BIGINT
> *XML_FIELD* napr. CHAR(1000)
>> >> > postgresql-c...@googlegroups.com<postgresql-cz%2Bunsu...@googlegroups.com>
>> .
>> >> > Další možnosti lze nastavit při návštěvě skupiny na stránce
>> >> > http://groups.google.com/group/postgresql-cz?hl=cs.
>> >> >
>> >> >
>> >>
>> >> --
>> >> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
>> >> PostgreSQL-cz ve Skupinách Google.
>> >> Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
>> >> postgr...@googlegroups.com.
>> >> Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
>> >> postgresql-c...@googlegroups.com<postgresql-cz%2Bunsu...@googlegroups.com>
>> .
>> >> Další možnosti lze nastavit při návštěvě skupiny na stránce
>> >> http://groups.google.com/group/postgresql-cz?hl=cs.
>> >>
>> >
>> > --
>> > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
>> > PostgreSQL-cz ve Skupinách Google.
>> > Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
>> > postgr...@googlegroups.com.
>> > Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
>> > postgresql-c...@googlegroups.com<postgresql-cz%2Bunsu...@googlegroups.com>
>> .
>> > Další možnosti lze nastavit při návštěvě skupiny na stránce
>> > http://groups.google.com/group/postgresql-cz?hl=cs.
>> >
>>
>> --
>> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
>> PostgreSQL-cz ve Skupinách Google.
>> Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
>> postgr...@googlegroups.com.
>> Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
>> postgresql-c...@googlegroups.com<postgresql-cz%2Bunsu...@googlegroups.com>
Která verze postgresql to je? S xml nepracuji, ale vím že dost podobných
problémů se opravilo v posledních verzích.
Tomáš
Niiiice ... d�l� to i v 9.0.1. Nepamatuji se �e bych za posledn� dva
roky na po��ta�i pou�il swap ;-)
To �e se to neuvoln� ani po skon�en� procesu je IMHO chyba, nicm�n� do C
funkc� v PostgreSQL nevid�m natolik abych ho odhalil. Pavle?
Tomďż˝
Trochu jsem se v tom vrtal a kouk�m �e ten xml2 contrib modul je
"deprecated" - nam�sto n�j je p��mo do core zabudovan� ekvivalentn�
funk�nost. Zkuste
select xpath('/data/text()', ('<data>' || generate_series ||
'</data>')::xml) from generate_series(1,500000);
to sice papďż˝ CPU ale nikoliv pamďż˝.
Tomďż˝
tak minimalne ten memory leak je chyba - to, ze to sezere pamet a
nevrati (aniz by doslo k chybe) chyba je :(. Ale nejsem si jisty, jak
moc se v tom bude nekdo chtit vrtat. Je tam dost komplikaci ohledne
spravy pameti, ale je docela mozne, ze si zatim nikdo nevzal na paskal
funkci xpath_number.
Pavel
> Tomáš
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
> Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu postgr...@googlegroups.com.
> Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu postgresql-c...@googlegroups.com.
Nikdo se v tom vrtat chtít nebude - je to deprecated, funkcionalitou to
plně nahrazují ty XML funkce zařazené do core a v těch ten memory leak
není.
Tomáš
Bezva, tohle vypadá použitelně.
Ale z xml2 používám ještě funkci xslt_process a tam žádnou náhradu nevidím. Navíc jsem s ní měl jeden problém, řešil jsem ho s Pavlem Stěhulem a ve verzi 9.1 by měla být oprava (viz http://archives.postgresql.org/pgsql-committers/2010-08/msg00120.php), takže úplně odepsaný ten modul asi ještě není?
Jirka
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> PostgreSQL-cz ve Skupinách Google.
> Chcete-li přidat příspěvek do této skupiny, odešlete e-mail na adresu
> postgr...@googlegroups.com.
> Chcete-li se odhlásit z této skupiny, pošlete e-mail na adresu
> postgresql-c...@googlegroups.com.
no vice-mene je. pokud jsem to spravne pochopil, tak tam je docela
problem se spravou pameti nad libxml2 - vrtalo se v tom dost lidi, a
jak je videt, tak to jeste nikdo nevyresil :( Jak je to s podporou
xslt nevim. Jestli je integrovana nebo ne. Ale verim tomu, ze bude
snaha tento modul zrusit.
Pavel
Ty SQL/XML funkce byly do core přidány už v 8.3 (měl bys to vědět, jsi u
toho uvedený v Release Notes ;-). Ale v principu máš pravdu, opravit by se
to asi mělo, už proto že některé ty funkce v core nejsou (např.
xslt_process, jak zmiňuje Jirka Škopík). Nicméně já to nejsem schopen
opravit, C jsem viděl asi tak před 10 lety.
Ostatně jak se to plánuje s podporou xml, resp. s tím xml2 modulem?
Evidentně je deprecated, tj. bude odstraněn, nicméně do core byla
přenesena jenom část funkcionality?
Tomáš
Včera jsem trochu googlil a hledal v archivech konferencí, a narazil jsem
na vlákno ve které se Tom Lane zmiňoval že když v libxml2 dojde k chybě
tak se neuvolní paměť nebo tak něco. Jj, s pamětí jsou akorát problémy -
kéž by v počítačích nic takového nebylo, svět by byl hned krásnější.
Nicméně měl jsem pocit že ta XML funkcionalita v jádře je také založena na
libxml2, a žádné leaky to tam nemá, ne?
Tomáš
ono se to dost prekopalo. ten memory leak v xml2 je docela dost
hloupej - pravdepodobne pochozi z nejakeho spatne udelaneho bugfixu. V
priloze je fix.
> Tomáš
Fajn. Zareportujes to na pgsql-bugs? Ja bych to udelal, nicmene nevim
presne v cem ta chyba je a nechci se chlubit cizim perim.
Tomas
uz jsem do pg_hackers poslal fix.
nicmene bude lepsi, kdyz to zaregistrujes na pg_bugs ty. O mne vsichni
vedi, ze nejsem uzivatel :)
Pavel
>
> Tomas
viz http://archives.postgresql.org/pgsql-hackers/2010-11/msg01798.php
prosim, kdyz narazite na podobnou chybu, tak ji reportujte. Nektere
veci lze opravit pomerne snadno, a muze to pomoci dalsim lidem.
Zdarek
Pavel
Dne 26. listopadu 2010 11:23 Pavel Stehule <pavel....@gmail.com> napsal(a):
Ámen!
Tomáš