Za předpokladu, že máme co do činění s velkým stolem , částečný index může pomoci:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;
Jak jste již zjistili:sestup nebo stoupání zde téměř nezáleží. Postgres dokáže skenovat pozpátku téměř stejnou rychlostí (výjimky platí pro vícesloupcové indexy).
Dotaz na použití tohoto indexu:
SELECT * FROM tbl
WHERE created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER BY created_at DESC
LIMIT 1;
Jde o to, aby byl index mnohem menší , takže by mělo být jednodušší ukládat do mezipaměti a udržovat.
- Musíte vybrat časové razítko, které bude zaručeně menší než to nejnovější.
- Čas od času byste měli index znovu vytvořit, abyste odstranili stará data.
- Podmínka musí být
IMMUTABLE
.
Takže jednorázový účinek se časem zhoršuje. Konkrétní problém je pevně zakódovaný stav:
WHERE created_at > '2013-09-15 0:0'::timestamp
Automatizovat
Index a své dotazy můžete čas od času aktualizovat ručně. Nebo to zautomatizujete pomocí funkce, jako je tato:
CREATE OR REPLACE FUNCTION f_min_ts()
RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$
Index:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();
Dotaz:
SELECT * FROM tbl
WHERE created_at > f_min_ts()
ORDER BY created_at DESC
LIMIT 1;
Automatizujte rekreaci pomocí cronu nebo nějaké události založené na spouštěči. Vaše dotazy mohou nyní zůstat stejné. Ale musíte znovu vytvořit všechny indexy použití této funkce jakýmkoliv způsobem po její změně. Stačí pustit a vytvořit každý z nich.
Nejprve ..
... vyzkoušejte, zda tímto skutečně narážíte na hrdlo láhve.
Vyzkoušejte, zda jednoduchý DROP index ... ; CREATE index ...
dělá práci. Pak mohl být váš index nafouknutý. Vaše nastavení automatického vysávání může být vypnuto.
Nebo zkuste VACUUM FULL ANALYZE
získat celou tabulku plus indexy v původním stavu a znovu zkontrolovat.
Další možnosti zahrnují obvyklé obecné ladění výkonu a indexy pokrytí v závislosti na tom, co z tabulky skutečně načtete.