Почему работа с отдельным разделом POSTGRES влияет на родительскую таблицу? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть база данных 24/7 postgres, в которой я разделил некоторые из основных таблиц, чтобы обеспечить обслуживание, пока данные все еще загружаются. К сожалению, изменения в отдельных разделах по-прежнему влияют на родительскую таблицу.

Моя таблица определена примерно так -

CREATE TABLE tableA ( loadedTime TIMESTAMP, rawData CHARACTER(150))
PARTITION BY RANGE (loadedTime)

И отдельные перегородки -

CREATE TABLE tableA_yyyymmdd PARTITION OF tableA FOR VALUES FROM () TO ()

Где диапазоны равны отдельным дням.

У меня есть процесс, который 24/7 вставляет записи в родительскую таблицу tableA (не определенный раздел), loadedTime всегда ссылается на текущее время, поэтому данные всегда загружен в сегодняшний раздел.

Почему изменение табличного пространства некоторых старых разделов приводит к превышению времени ожидания вставок в текущий раздел? Насколько я понимаю, разделы почти как отдельные таблицы, и я должен иметь возможность работать с разделами, не вызывая проблем с родительской таблицей - или я неправильно понял?

ОБНОВЛЕНИЕ - в настоящее время используется postgres 10.5. У меня есть похожая проблема, если я пытаюсь DETACH, VACUUM и ATTACH старый раздел из родительской таблицы. Я могу получить доступ к родителю после отсоединения раздела, но DETACH и ATTACH требуют времени и ВСТАВЛЯЮТ на тайм-ауте родителя во время шагов отсоединения / присоединения.

1 Ответ

0 голосов
/ 01 июля 2019

При использовании Postgres 10.5 INSERT в родительской таблице блокирует все разделы, прежде чем определить, в какой раздел следует вставить данную строку.Если вы заблокировали один из более старых разделов, чтобы изменить его табличное пространство, то INSERT должен подождать, чтобы получить блокировку этого раздела, что может объяснить, почему для него истекло время ожидания.Postgres 11 имеет такое же поведение, но Postgres 12 (в настоящий момент в бета-версии) исправляет это так, что INSERT на родительской таблице не будет блокировать операции на более старых разделах или наоборот, то есть, если INSERTпредназначен только для самого нового раздела. Команды

ATTACH и DETACH блокируют родительскую таблицу.Так что, если вы входите в родительскую таблицу одновременно с подключением или отключением раздела, первый может быть заблокирован до завершения последнего.ATTACH может занять некоторое время, потому что он должен сканировать присоединяемый раздел, чтобы проверить, не содержит ли он строк, нарушающих ограничение раздела.Опять же, в Postgres 12 улучшены такие вещи, что ATTACH не блокирует одновременные INSERT s (и SELECT / UPDATE / DELETE).

Чтобы избежать блокировки родительской таблицы дляВ течение длительного времени для этой проверочной проверки вы можете добавить проверочное ограничение к присоединяемой таблице, которое соответствует требуемому ограничению раздела перед выполнением команды ATTACH.С установленным проверочным ограничением Postgres может пропустить дорогостоящий этап проверки ATTACH, поскольку ограничение раздела уже будет действительным, поскольку проверочное ограничение действительно.

...