Устаревшая строка не перемещается из раздела внешней таблицы postgres - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь узнать, как настраивается разделение в Postgres.

В моей настройке Postgres есть таблица temperature, в которой есть 4 раздела, каждый из которых покрывает различный диапазон значения "timestamp". * Таблица 1004 *

postgres=# \d+ temperature
                                                     Partitioned table "public.temperature"
  Column   |            Type             | Collation | Nullable |                 Default                 | Storage | Stats target | Description 
-----------+-----------------------------+-----------+----------+-----------------------------------------+---------+--------------+-------------
 id        | bigint                      |           | not null | nextval('temperature_id_seq'::regclass) | plain   |              | 
 city_id   | integer                     |           | not null |                                         | plain   |              | 
 timestamp | timestamp without time zone |           | not null |                                         | plain   |              | 
 temp      | numeric(5,2)                |           | not null |                                         | main    |              | 
Partition key: RANGE ("timestamp")
Partitions: temperature_201901 FOR VALUES FROM ('2019-01-01 00:00:00') TO ('2019-02-01 00:00:00'),
            temperature_201902 FOR VALUES FROM ('2019-02-01 00:00:00') TO ('2019-03-01 00:00:00'),
            temperature_201903 FOR VALUES FROM ('2019-03-01 00:00:00') TO ('2019-04-01 00:00:00'),
            temperature_201904 FOR VALUES FROM ('2019-04-01 00:00:00') TO ('2019-05-01 00:00:00')

temperature_201904, в частности, является внешней таблицей

postgres=# \d+ temperature_201904 
                                                           Foreign table "public.temperature_201904"
  Column   |            Type             | Collation | Nullable |                 Default                 | FDW options | Storage | Stats target | Description 
-----------+-----------------------------+-----------+----------+-----------------------------------------+-------------+---------+--------------+-------------
 id        | bigint                      |           | not null | nextval('temperature_id_seq'::regclass) |             | plain   |              | 
 city_id   | integer                     |           | not null |                                         |             | plain   |              | 
 timestamp | timestamp without time zone |           | not null |                                         |             | plain   |              | 
 temp      | numeric(5,2)                |           | not null |                                         |             | main    |              | 
Partition of: temperature FOR VALUES FROM ('2019-04-01 00:00:00') TO ('2019-05-01 00:00:00')
Partition constraint: (("timestamp" IS NOT NULL) AND ("timestamp" >= '2019-04-01 00:00:00'::timestamp without time zone) AND ("timestamp" < '2019-05-01 00:00:00'::timestamp without time zone))
Server: shard02

Вставка работает как положено. Если я вставляю следующее значение и проверяю с удаленного хоста shard02, то это значение существует. Fantasti c!

postgres=# select * from temperature_201904;
 id | city_id |      timestamp      | temp  
----+---------+---------------------+-------
  1 |       1 | 2019-04-02 00:00:00 | 12.30
(1 row)

Однако, если я обновлю метку времени этой строки так, чтобы она больше не действовала для диапазона, определенного для раздела, я ожидал, что он будет перемещен и помещен в правильный раздел, temperature_201901, но это не так.

postgres=# update temperature set timestamp =  '2019-01-04' where id=1;
UPDATE 1
postgres=# select * from temperature_201904 ;
 id | city_id |      timestamp      | temp  
----+---------+---------------------+-------
  1 |       1 | 2019-01-04 00:00:00 | 12.30

Опять же, повторюсь, у этой таблицы есть диапазон temperature_201904 FOR VALUES FROM ('2019-04-01 00:00:00') TO ('2019-05-01 00:00:00') и она чужая.

Такое ощущение, что я что-то здесь упускаю.

Это ожидаемое поведение? Если да, есть ли способ настроить так, чтобы данные автоматически перемещались между узлами при изменении ограничений их раздела?

Заранее спасибо!

postgres=# SELECT version();
                                                     version                                                      
------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.2 (Debian 12.2-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit

1 Ответ

2 голосов
/ 28 апреля 2020

Это, кажется, ожидалось. Из документов

Хотя строки можно перемещать из локальных разделов в раздел сторонней таблицы (при условии, что оболочка внешних данных поддерживает маршрутизацию кортежей), их нельзя перемещать из сторонних -table раздел на другой раздел.

Теперь я ожидал бы ОШИБКИ, а не молча нарушать подразумеваемое ограничение, но я не ожидал бы, что это сработает так, как вы этого хотите.

...