26. dubna 2010

Jak databázi nepřidávat práci

Procházel jsem log soubor databáze a díval jsem se na dlouho trvající SQL dotazy. Několik jsem jich našel a většinou se shodovaly v jedné drobnosti – přidávaly databázi zbytečnou práci:


....
t.datum + '30 days'::interval > now()
....


O co v tomto případě jde? Dejme sloupec datum typu TIMESTAMP, od informace uložené v tomto sloupci odečítáme interval 30 dnů. Tím jsme znemožnili využít index nad sloupcem datum a také pro každý řádek znovu vyhodnocujeme výraz now().


Jednoduchou změnou lze dotaz znatelně zrychlit a navíc mu umožníme použít index nad sloupcem datum:

...
t.datum > 'now'::timestamp - '30 days'::interval
...


Také 'now'::timestamp - '30 days'::interval je vyhodnoceno pouze jednou, není třeba znovu počítat pro každé porovnání.