Jasně tomu rozumím a dává mi smysl, že když řeknu postgres:
ORDER BY date OFFSET 250000 LIMIT 500
Tak použije index a query je hotový ve stovkách ms. A když řeknu Postgres
ORDE BY date OFFSET 500000 LIMIT 1000
Tak už query trvá přes 10 vteřin, protože se postgres přepne.
Ale: Kdyby se to nepřeplo, tak to určitě nebude trvat několik vteřin ale prostě násobek toho horního času. Tzn. já vím, že by theory někde je řečeno, že v určitých situacích je seq scan rychlejší než index scan s následným randomom access, ale v >> praxi <<, protože ladím postgres queries posledních 5 let často, tak jasně vidím, že seq scan zpravidla nikdy nechci, protože trvá >> násobně << déle. V praxi.
Takže někde "in RDB theory" je lepší seq. scan, ale v praxi já jasně vidím, že zpravidla vždycky je lepší index scan.
Taky kolikrát jsem zuřil když jsem hledal, proč mi pg přepne na seq. scan, a X-krát jsem četl, že je seq scan výhodnější v určitých situacích, a já přitom jasně vidím, že je násobně nevýhodnější, a vidím to jasně i teď u výše uvedených queries.
A potom co se týká toho ORDER BY, tak já asi pořád nesouhlasím s vám v tom, že to neumí zjistit OFFSET 10000 hned indexu. Protože ty indexy jsou sortovány. Pakliže já mám v indexu sortovány záznamy podle datumu Ascending, tak můžu skočit na záznam č. 10001 v INDEXU, a vím, že je na stránce 12345 na řádku 123. Z indexu si pak načtu pozice dalších 500 záznamů a vím, že jsou sorted a že jsou OFFSET 10000 v tabulce.
By theory jistojistě to udělat takto lze, technicky. O tom jsem přesvědčen. jestli to však je v silách Postgres to nevím. Já na vlasnní oči viděl, jaké dokáže Postgres query engine dělat do očí bijící nesmysly.
Jako např. že si je schopno počítat json_agg funkce a jine funkce v SELECTU u záznamů, které nejsou vráceny v konečném
výsledku dotazu, a zpomalí tím query násobně.
Nebo to, že Postgres nedokáže optimalizovat Views používané ve FROM klauzuli v jiném View, tzn. nedokáže jakoby "mergnout" a optimalizovat 2 selecty ve 2 Views. A tak namísto Views já musím uděla strašný copy-paste a použít jeden obří SQL query, aby Postgrs pochopilo, že některé věci může vykrátit. Katastrofa, a vede to k velkému nepořádku, protože Views mají velké SQL queries schovávat.