208
« kdy: 18. 02. 2019, 18:52:36 »
Jak indexy, tak tabulky jsou na disku organizované pomocí stránek - vždy se načítají celé stránky a ukládají se do interní cache datových stránek - v Postgresu shared buffers, která je omezena počtem. Zpracování probíhá často po stránkách, načtu minimální sadu indexových stránek, abych se dostal k listům, získám adresy, a pro každou adresu dohledám záznam ve stránce, která už je v cache, nebo kterou musím načíst do cache. Pokud nestačí cache, tak přepisuji nejdéle nepoužité stránky. Díky tomu mohu provést operace nad tabulkami, které se mi ani náhodou nevejdou do RAM - za cenu, že některé stránky načítám z disku opakovaně. U datových stránek to nemusí být až takový problém. Naopak u klíčových (kořenových) stránek indexu to může mít fatální dopad na výkon.
I z tohoto důvodu má Postgres horní omezení velikosti použitého indexu. Pokud by hrozilo velké riziko, že index se nevejde do cache Pg případně FS cache, tak se prostě nepoužije, a úloha se provede sekvenčně - na což v podstatě není potřeba skoro žádná RAM.