Ранжирование разделов по дате с одним разделом для НУЛЕВЫХ дат

#postgresql

#postgresql

Вопрос:

Я хотел бы иметь таблицу с удаленным столбцом, содержащую дату, когда элемент был автоматически удален. Строки с нулевым значением в удаленном столбце являются активными. Я не смог понять наш синтаксис для создания раздела для нулевых значений в удаленном столбце. Каков синтаксис создания такого столбца?

 create table my_table_pointing(street_id int, p_city_id int, name varchar(10), deleted date)
PARTITION BY RANGE (deleted);

CREATE TABLE my_table_pointing_2020 PARTITION OF my_table_pointing
    FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');


   CREATE TABLE my_table_pointing_active PARTITION OF my_table_pointing
     "for all rows where date is null"...
  

Спасибо!

Комментарии:

1. Возможно, отфильтрованный индекс с where deleted is null более полезен в этом случае.

2. @LaurenzAlbe постепенная предварительная организация ваших данных для повышения эффективности некоторых будущих действий является одним из важных применений секционирования.

3. @LaurenzAlbe, Но я полагаю, это должно происходить только один раз за строку. Ничем не отличается от удаления из активной таблицы и вставки в таблицу истории.

Ответ №1:

При условии, что вы используете PG11 или более позднюю версию, вы можете создать раздел по умолчанию, и строки с deleted is null будут перенаправляться туда.

 create table my_table_pointing_active partition of my_table_pointing default;
  

Комментарии:

1. Может быть, он также захочет создать проверку, подтверждающую ограничение deleted IS NULL ?

2. @jjanes Я бы не стал, но тогда мой другой раздел (история) был бы от -infinity до infinity вот так: db-fiddle.com/f/gRKWcFHHFikxuv3WC19rFL/0 Отредактируйте, чтобы добавить: я не думаю, что я когда-либо использовал бы разделение для этого без большого дополнительного тестирования. Плюс я один из тех клоунов, которые помещают '9999-12-31' в мои текущие записи вместо null

3. Спасибо @Mike Organek. Я думал о разделе по умолчанию, но есть два недостатка 1) когда я добавляю новый раздел, Postgres сканирует весь раздел по умолчанию, чтобы увидеть, нужно ли копировать записи оттуда во вновь созданный раздел. Если значения null перейдут в их собственный раздел, отличный от стандартного, это будет пропущено. 2) Я предпочитаю сохранить раздел по умолчанию, чтобы отслеживать проблемные даты, у которых нет разделов (будущие даты, очень старые даты).