Триггерные таблицы данных в Postgres - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть таблица из нескольких миллионов записей, к которым я выполняю запрос и вставляю результаты в другую таблицу, которую будут запрашивать клиенты.Этот процесс занимает около 20 секунд.

Как выполнить этот запрос, построив эту новую таблицу без влияния на клиентов, которые могут выполнять запросы к целевой таблице?

Например.Я запускаю

BEGIN;
DROP TABLE target_table;
SELECT blah, blahX, blahY
INTO target_table
FROM source_table
GROUP BY blahX, blahY
COMMIT;

, который затем блокирует запросы к:

SELECT SUM(blah)
FROM target_table
WHERE blahX > x

В дни работы с некоторыми администраторами баз данных SQL Server я вспоминаю, как они создавали временные таблицы, а затем переворачивали ихв течение текущей таблицы.Это выполнимо / практично в Postgres?

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

Здесь вы хотите минимизировать время блокировки, которое, конечно, если вы включите запрос (который занимает некоторое время) в транзакцию, не будет работать.

В этом случае я предполагаю, что вы на самом деле обновляете ту 'target_table', которая содержит позиции объектов "бла", когда вы запускаете свой скрипт, это правильно?

BEGIN;
CREATE TEMP TABLE temptable AS
SELECT blah, blahX, blahY
FROM source_table
GROUP BY blahX, blahY
COMMIT;

BEGIN;
TRUNCATE TABLE target_table
INSERT INTO target_table(blah,blahX,blahY)
    SELECT blah,blahX,blahY FROM temptable;
DROP TABLE temptable;
COMMIT;

Как упоминалось в комментариях, будет быстрее отбрасывать индексы перед усечением и создавать их заново сразу после загрузки данных, чтобы избежать ненужных изменений индекса.

Для получения полной информации о том, что является и не возможно с PostgreSQL в этом отношении: http://postgresql.1045698.n5.nabble.com/ALTER-TABLE-REPLACE-WITH-td3305036i40.html

0 голосов
/ 23 сентября 2011

Вы можете создать таблицу, отбросить таблицу и переименовать таблицу в каждой версии SQL, которую я когда-либо использовал.

BEGIN;
SELECT blah, blahX, blahY
INTO new_table
FROM source_table
GROUP BY blahX, blahY;
DROP TABLE target_table;
ALTER TABLE new_table RENAME TO target_table;
COMMIT;

Я не уверен, насколько выможет использовать временную таблицу для этого в PostgreSQL.PostgreSQL создает временные таблицы в специальной схеме;Вы не можете выбрать схему.Но вы можете создать его как временную таблицу, удалить существующую таблицу и переместить ее с помощью SET SCHEMA.

В какой-то момент любой из них потребует блокировки таблицы.(Дух.) Вы могли бы значительно ускорить процесс, поместив сменную таблицу на SSD.

0 голосов
/ 23 сентября 2011

Там ALTER TABLE ... RENAME TO ...:

ALTER TABLE name
    RENAME TO new_name

Возможно, вы могли бы выбрать промежуточную таблицу, а затем удалить target_table и переименовать промежуточную таблицу в target_table.

Я понятия не имею, как это будет взаимодействовать с любыми запросами, которые могут выполняться к target_table при попытке переименовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...