Удаление строк в таблице Postgres с помощью ctid - PullRequest
0 голосов
/ 30 апреля 2019

У нас есть таблица с почти 2 миллиардами записанных событий. Согласно нашей модели данных, каждое событие уникально идентифицируется с помощью 4 столбцов объединенного первичного ключа. Исключая первичный ключ, существует 5 индексов B-дерева, каждый на один столбец. Всего 6 индексов B-дерева.

Записанные события охватывают годы, и теперь нам нужно удалить данные старше 1 года.

У нас есть столбец time с длинными значениями, записанными для каждого события. И мы используем следующий запрос,

delete from events where ctid = any ( array (select ctid from events where time < 1517423400000 limit 10000) )

Обновляются ли индексы?

Во время тестирования это не так.

После вставки

total_table_size - 27893760 table_size - 7659520 index_size - 20209664

После удаления

total_table_size - 20226048 table_size - 0 index_size - 20209664

1 Ответ

0 голосов
/ 30 апреля 2019

Реиндекс можно сделать

Command:     REINDEX
Description: rebuild indexes
Syntax:
REINDEX { INDEX | TABLE | DATABASE | SYSTEM } name [ FORCE ]
...