-
Indexy jsou obvykle k ničemu pro operace na 90 % všech řádků. Sekvenční skenování bude v obou případech rychlejší. (Platí exotické výjimky.)
-
Pokud potřebujete povolit souběžné čtení, nemůžete na stůl použít exkluzivní zámek. Takže také nemůžete zahodit žádné indexy ve stejné transakci.
-
Mohli byste vynechejte indexy v samostatných transakcích, abyste udrželi dobu trvání výhradního zámku na minimu. V Postgres 9.2 nebo novějším můžete také použít DROP INDEX CONCURRENTLY , který potřebuje pouze minimální zámky. Později použijte
CREATE INDEX CONCURRENTLY
znovu vytvořit index na pozadí – a provést pouze velmi krátký exkluzivní zámek.
Pokud máte stabilní stav pro identifikaci 10 % (nebo méně) řádků, které zůstávají, navrhoval bych částečný index pouze na těchto řádcích, abyste získali to nejlepší pro oba:
- Čtení dotazů může kdykoli rychle přistupovat k tabulce (pomocí částečného indexu).
- Velké
DELETE
nebude vůbec upravovat částečný index, protože žádný z řádků není zapojen doDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Za předpokladu delete_flag
je boolean
. Musíte do svých dotazů zahrnout stejný predikát (i když se to zdá logicky nadbytečné), abyste se ujistili, že Postgres umí částečný index.