-
Индексите обикновено са безполезни за операции върху 90% от всички редове. Последователните сканирания ще бъдат по-бързи и в двата случая. (Прилагат се екзотични изключения.)
-
Ако трябва да разрешите едновременни четения, не можете да вземете изключително заключване на масата. Така че вие също не можете да изпуснете никакви индекси в една и съща транзакция.
-
Вие можете пуснете индекси в отделни транзакции, за да запазите продължителността на изключителното заключване минимална. В Postgres 9.2 или по-нова версия можете също да използвате ПРЕСЪЩАВАНЕ НА ИНДЕКС ЕДНОВРЕМЕННО , който се нуждае само от минимални ключалки. По-късно използвайте
CREATE INDEX CONCURRENTLY
за да възстановите индекса във фонов режим - и да вземете само много кратко изключително заключване.
Ако имате стабилно състояние за идентифициране на 10% (или по-малко) от редовете, които остават, бих предложил частичен индекс само на тези редове, за да получите най-доброто и за двете:
- Заявките за четене могат да имат бърз достъп до таблицата (чрез частичния индекс) по всяко време.
- Голямото
DELETE
изобщо няма да промени частичния индекс, тъй като нито един от редовете не участва вDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Приемайки delete_flag
е boolean
. Трябва да включите един и същ предикат във вашите заявки (дори ако изглежда логически излишен), за да сте сигурни, че Postgres може да направи частичния индекс.