Nebudem opakovat uz povedane, ale dam hint k trojke.
3.) V aplikaci dochází k vyhledávání vydaných knih v nějakém časovém horiozontu (měsíc/rok). Takže SQL dotaz potom vypadá:
SELECT * FROM kniha WHERE year(datum_vydani)=:uživatelsky_zadaná_rok AND month(datum_vydani) = :uživatelsky_zadaný_měsíc. Měl by být v tomhle případě použit index na datum_vydaní?
Dve možnosti:
Osobne by som upravil podmienku na iny selekt, ktory ale vrati to, co pozadujete a pouzije i datumovy index. Nieco, co pouzije nezmeneny stlpec datum_vydani. Napriklad:
SELECT * FROM kniha WHERE datum_vydani between ':uživatelsky_zadaná_rok-:uživatelsky_zadaný_měsíc-01' AND ':uživatelsky_zadaná_rok-:uživatelsky_zadaný_měsíc-31';
Tam treba ale ošetriť odfiltrovanie záznamov, kde nieje deň 31. Ak si dobre pamatám, tak dátum 2020.02.31 je vpodstate postgrečkom pretransformované na 2020.03.02 (druhý marec).
ALEBO:
vytvoriť "computed index", napríklad v štýle:
CREATE INDEX idx_rok_a_mesiac_vydania ON kniha (date_trunc('year', datum_vydani)) INCLUDE (date_trunc('month', datum_vydani));
Vyhodou je, ze povodny selekt pojde bezozmeny a vyuzije sa jeden index (obsahujuci dva stlpce).