В проекте, над которым я недавно работал, многие таблицы (PostgreSQL) баз данных просто используются в качестве больших массивов поиска. У нас есть несколько фоновых рабочих служб, которые периодически извлекают последние данные с сервера, а затем заменяют все содержимое таблицы самыми последними данными. Замена должна быть атомарной, потому что мы не хотим, чтобы частично заполненная таблица была видна наблюдателям.
Я думал, что самый простой способ сделать замену - что-то вроде этого:
BEGIN;
DELETE FROM some_table;
COPY some_table FROM 'source file';
COMMIT;
Но я обнаружил, что во многих производственных кодах этот метод используется вместо:
BEGIN;
CREATE TABLE some_table_tmp (LIKE some_table);
COPY some_table_tmp FROM 'source file';
DROP TABLE some_table;
ALTER TABLE some_table_tmp RENAME TO some_table;
COMMIT;
(я опускаю некоторую логику, такую как смена владельца последовательности и т. Д.)
Я просто не вижу преимущества этого метода. Особенно после некоторых открытий и экспериментов. Операторы SQL, такие как ALTER TABLE
и DROP TABLE
, получают блокировку ACCESS EXCLUSIVE , которая даже блокирует SELECT.
Может кто-нибудь объяснить, какую проблему пытается решить последняя модель SQL? Или это неправильно, и мы должны избегать его использования?