Akorát teda když user přijde k UI a chce udělat jump v tabulce záznamů na stránku 100, tak se musí stejně proiterovat všechny předchozí stránky, aby si ono číslo záznamu na stránce 100 získal.
Pre uzivatela moze byt skok na konkretnu stranku uzitocny iba vtedy ak tam najde hodnoty ktore potrebuje. To je mozne iba vtedy ak sa zaznamy v tabulke nemenia. Kazdy insert, update alebo delete zmeni poziciu udajov tak, ze offset udajov ktore ho zaujimaju sa zmeni. Ak mas uzivatela, ktory vie ake data potrebuje, tak daleko vhodnejsi je normalny filter (where). Ak nevie ake udaje potrebuje, len vie ze potrebuje udaje zo stranky 100, tak mu je zrejme jedno co mu naservirujes.
A preco DB nerobi seek na OFFSET podla INDEXU? Proste index je strom. Vo vacsine pripadov. Vetvy obsahuju rozsahy s odkazmi na dalsie vetvy a az na koniec na listy kde su konkretne hodnoty s odkazmi na zaznamy. Je to idealne ked potrebujes dostat odkaz na zaklade hodnoty. Seek na poziciu je vhodny ak mas data ulozene ako vektor (tak je ulozena tabulka).
Ta magia by sa dala realizovat cez pomocnu tabulku ktora by obsahovala pravidelne aktualizovany histogram hodnot, na zaklade ktorych vies povedat aky rozsah hodnot pripada na konkretnu "stranku".
Ale podla mojej skusenosti je daleko jednoduchsie vysvetlit uzivatelom, ze by mali vediet ake parametre maju zadat do filtra aby sa dostali k udajom ktore potrebuju. Zvysi to jednak ich efektivitu prace, tak aj tvoju ked nebudes musiet vymyslat algoritmy ktore by suplovaly nedostatky uzivatelov. Pretoze v pripade zivej DB kde sa hodnoty pravidelne menia je poziadavka typu "Chcem stranku 100, pretoze pred tyzdnom tam boli hodnoty ktore chcem vidiet!' je neskutocne dementna.
A este preco ten dotaz ktory si pouzil nie je efektivny.
Pozri si plan toho dotazu. Pouzi napr. pgadmin, ten ti tu textovu informaciu o plane prevedie aj na graf. Co sa tam teda deje:
- Planovac vytvori plan ktory je optimalny podla statistik. Na jeho vystupe je kompletna sada udajov, z dovodu v 2.
- Udaje z 1. spracovava iterator pre sort. Samozrejme ze z 1. potrebuje uplne vsetky hodnoty. Tak sort proste funguje. Je irelevantne ci ma k dispozicii index alebo nie.
- Teraz pride na radu iteratot pre offset, konzumuje data a zahadzuje ich kym nenapocita pozadovany ofset. Ked ma pozadovany ofset tak data posiela na vystup, kym pocitadlo nedosiahne hodnoty offset+limit. Potom konci, a oznami predhadzajucemu iteratoru ze uz dalsie data nepotrebuje cim ukonci jeho cinnost, rovnako ako aj pracu dalsich iteratorov v retazi pred nim.
Ak by mal iterator v 3. ovplyvnovat iteratory v 1. tak na to nedokazes napisat planovac, ktory by nemal natvrdo nakodovane varianty toho ako je mozne napisat dotaz a ku kazdej variante zvlast exekutor.