У меня очень большая таблица базы данных в PostgresQL и столбец вроде "скопирован". Каждая новая строка начинается без загрузки и позже будет воспроизведена на другую. В этой таблице есть частичный индекс "btree (ID), WHERE replicated = 0". Фоновая программа делает выбор для не более 2000 записей (LIMIT 2000), работает над ними, а затем фиксирует изменения в одной транзакции с использованием 2000 подготовленных sql-команд.
Теперь проблема заключается в том, что я хочу предоставить пользователю опцию reset для этого реплицированного значения, снова сделайте ее равной нулю.
Набор таблиц обновления, реплицированный = 0;
невозможно:
- Требуется очень много времени.
- Он дублирует размер столбца из-за 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)
BTW: Реальная проблема сложнее, и мы говорим о встроенной системе, которая уже развернута, поэтому удаленные изменения схемы сложны, но возможны К сожалению, PostgresQL 7.4.
Количество строк, о которых я говорю, равно, например, 90000000. Размер базы данных может составлять несколько десятков гигабайт.
Сама база данных содержит только 5 таблиц, одна очень большая. Но это неплохой дизайн, потому что эти встроенные ящики работают только с одним типом сущности, это не ERP-система или что-то в этом роде!
Любые идеи?