Я хочу сделать большое обновление в таблице в PostgreSQL, но мне не нужно, чтобы целостность транзакций поддерживалась в течение всей операции, потому что я знаю, что столбец, который я изменяю, не будет записан в или читать во время обновления. Я хочу знать, есть ли простой способ в консоли psql для ускорения этих типов операций.
Например, скажем, у меня есть таблица под названием "заказы" с 35 миллионами строк, и я хочу сделать это:
UPDATE orders SET status = null;
Чтобы избежать переадресации в оффтопическое обсуждение, допустим, что все значения статуса для 35 миллионов столбцов в настоящее время установлены на одно и то же (не нулевое) значение, что делает индекс бесполезным.
Проблема с этим утверждением заключается в том, что требуется очень много времени для вступления в силу (исключительно из-за блокировки), и все измененные строки блокируются до завершения всего обновления. Это обновление может занять 5 часов, тогда как что-то вроде
UPDATE orders SET status = null WHERE (order_id > 0 and order_id < 1000000);
может занять 1 минуту. Более 35 миллионов строк, делая вышеизложенное и разбивая его на куски 35, займет всего 35 минут и сэкономит мне 4 часа и 25 минут.
Я мог бы сломать его еще дальше с помощью script (используя здесь псевдокод):
for (i = 0 to 3500) {
db_operation ("UPDATE orders SET status = null
WHERE (order_id >" + (i*1000)"
+ " AND order_id <" + ((i+1)*1000) " + ")");
}
Эта операция может завершиться всего за несколько минут, а не 35.
Итак, это сводится к тому, что я действительно спрашиваю. Я не хочу писать freaking script для разбивки операций каждый раз, когда я хочу сделать такое одноразовое обновление. Есть ли способ выполнить то, что я хочу полностью в SQL?