У меня очень большая таблица базы данных в PostgresQL и столбец типа «скопирован». Каждая новая строка начинается без загрузки и позже будет воспроизведена на другую. В этой таблице есть частичный индекс «btree (ID), WHERE replicated = 0». Фоновая программа делает выбор для не более 2000 записей (LIMIT 2000), работает над ними, а затем фиксирует изменения в одной транзакции с использованием 2000 подготовленных SQL-команд.Обновление ОЧЕНЬ БОЛЬШОЙ таблицы базы данных PostgreSQL эффективно
Теперь проблема заключается в том, что я хочу дать пользователю возможность сбросить это реплицированное значение, снова сделать все нулевое значение.
Набор таблиц обновления, реплицированный = 0;
не представляется возможным:
- Это занимает очень много времени
- Он дублирует размер Tabel из-за MVCC
- Это делается в одной транзакции: Это либо выходит из строя или проходит.
На самом деле для этого случая мне не нужны транзакционные функции: если система идет вниз, она обрабатывает только ее части.
Некоторые другие проблемы: Ведение
update set replicated=0 where id >10000 and id<20000
также плохо: Это последовательное сканирование всех на всей таблицы, которая является слишком медленным. Если бы это не было сделано, это все равно было бы медленным, потому что было бы слишком много поисков.
Что мне действительно нужно, это пройти через все строки, изменить их и не связываться с гигантской транзакцией.
Как ни странно,
UPDATE table
SET replicated=0
WHERE ID in (SELECT id from table WHERE replicated= LIMIT 10000)
также медленно, хотя это должно быть хорошо: Пройдите через стол в DISK-порядку ...
(Обратите внимание, что в этом случае также индекс, который покрыт этим)
(обновление LIMIT как Mysql недоступен для PostGreSQL)
КСТАТИ: реальная проблема более сложна, и мы говорим о встроенная система, которая уже развернута, поэтому удаленные изменения схемы сложны, но возможны. К сожалению, это PostgresQL 7.4.
Количество строк, о которых я говорю, равно, например, 90000000. Размер базы данных может составлять несколько десятков гигабайт.
В самой базе данных содержится всего 5 таблиц, одна из которых очень большая. Но это неплохой дизайн, потому что эти встроенные ящики работают только с одним типом сущности, это не ERP-система или что-то в этом роде!
Любые идеи?
Это очень хорошая идея, хотя, к сожалению, для нее требуется изменение схемы (процедура обновления по длине). Что мне действительно нравится в этом подходе, так это то, что текущий частичный индекс внутренне очень похож на эту идею! Только более гибкий и управляемый. – Christian 2008-09-21 21:52:42