PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да изтриете много редове от често посещавана таблица

  1. Индексите обикновено са безполезни за операции върху 90% от всички редове. Последователните сканирания ще бъдат по-бързи и в двата случая. (Прилагат се екзотични изключения.)

  2. Ако трябва да разрешите едновременни четения, не можете да вземете изключително заключване на масата. Така че вие ​​също не можете да изпуснете никакви индекси в една и съща транзакция.

  3. Вие можете пуснете индекси в отделни транзакции, за да запазите продължителността на изключителното заключване минимална. В Postgres 9.2 или по-нова версия можете също да използвате ПРЕСЪЩАВАНЕ НА ИНДЕКС ЕДНОВРЕМЕННО , който се нуждае само от минимални ключалки. По-късно използвайте CREATE INDEX CONCURRENTLY за да възстановите индекса във фонов режим - и да вземете само много кратко изключително заключване.

Ако имате стабилно състояние за идентифициране на 10% (или по-малко) от редовете, които остават, бих предложил частичен индекс само на тези редове, за да получите най-доброто и за двете:

  • Заявките за четене могат да имат бърз достъп до таблицата (чрез частичния индекс) по всяко време.
  • Голямото DELETE изобщо няма да промени частичния индекс, тъй като нито един от редовете не участва в DELETE .
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;

Приемайки delete_flag е boolean . Трябва да включите един и същ предикат във вашите заявки (дори ако изглежда логически излишен), за да сте сигурни, че Postgres може да направи частичния индекс.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Потокът, извлечен от Postgres, като jOOQ не връща резултати от класа

  2. Агрегирайте функции в множество колони в postgres

  3. Как да инсталирате Haproxy и Keepalived

  4. Как да конвертирате низ в unicode с помощта на PostgreSQL?

  5. Postgresql - връща целия ред като масив