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

Jak odstranit mnoho řádků z často používané tabulky

  1. 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.)

  2. 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.

  3. 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 do DELETE .
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.



  1. php výstup z mysql do html tabulky

  2. Regexp a mysql:existuje operátor AND

  3. jak získat přístup ke vzdálené databázi mysql

  4. Připojení k postgresu ze strojopisu přestane fungovat