sql >> Databáze >  >> RDS >> PostgreSQL

Indexováno ORDER BY s LIMITEM 1

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.

  1. Musíte vybrat časové razítko, které bude zaručeně menší než to nejnovější.
  2. Čas od času byste měli index znovu vytvořit, abyste odstranili stará data.
  3. 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.




  1. Smyčka na tabulkách s PL/pgSQL v Postgresu 9.0+

  2. Jak zazipovat soubor v PL/SQL?

  3. Spouštěč aktualizace SQL pouze při změně sloupce

  4. Předání pole dat jako vstupního parametru proceduře Oracle