Удаление записей, имеющих внешний ключ к секционированной таблице на PostgreSQL - PullRequest
0 голосов
/ 28 июня 2019

У меня есть секционированная таблица datapoint, у которой есть дочерние таблицы, такие как datapoint_s1, datapoint_s2, ...

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

Вот история;

Таблица Datapoint составляет около 100 ГБ со всеми секционированными таблицами. Я усек таблицу datapoint_s2. После этого я хочу удалить устройства из таблицы datapoints_s2. Кроме того, в других многораздельных таблицах нет данных, касающихся устройств, которые я хочу удалить. Хотя таблица datapoint_s2 пуста, COMMIT; ожидает более часа, чтобы завершить процесс.

Изменить: Когда я отменяю запрос, эта ошибка произошла.

ERROR:  canceling statement due to user request
CONTEXT:  SQL statement "SELECT 1 FROM "public"."datapoint" x WHERE $1 OPERATOR(pg_catalog.=) "device_id" FOR KEY SHARE OF x"

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

Редактировать:

Описание родительской таблицы:

                                                      Table "public.datapoint"
   Column   |           Type           | Collation | Nullable |                Default                | Storage  | Stats target | Description
------------+--------------------------+-----------+----------+---------------------------------------+----------+--------------+-------------
 id         | bigint                   |           | not null | nextval('datapoint_id_seq'::regclass) | plain    |              |
 station_id | integer                  |           | not null |                                       | plain    |              |
 device_id  | integer                  |           | not null |                                       | plain    |              |
 data       | jsonb                    |           |          |                                       | extended |              |
 created_at | timestamp with time zone |           | not null |                                       | plain    |              |
Partition key: LIST (station_id)
Indexes:
    "datapoint_uniq" UNIQUE CONSTRAINT, btree (station_id, device_id, created_at)
Foreign-key constraints:
    "datapoint_device_id_fk" FOREIGN KEY (device_id) REFERENCES device(id) DEFERRABLE INITIALLY DEFERRED
    "datapoint_station_id_fk" FOREIGN KEY (station_id) REFERENCES station(id) DEFERRABLE INITIALLY DEFERRED
Partitions: datapoint_s2 FOR VALUES IN (10),
            datapoint_s3 FOR VALUES IN (11),
            ....

Описание дочерней таблицы:

                                                    Table "public.datapoint_s2"
   Column   |           Type           | Collation | Nullable |                Default                | Storage  | Stats target | Description
------------+--------------------------+-----------+----------+---------------------------------------+----------+--------------+-------------
 id         | bigint                   |           | not null | nextval('datapoint_id_seq'::regclass) | plain    |              |
 station_id | integer                  |           | not null |                                       | plain    |              |
 device_id  | integer                  |           | not null |                                       | plain    |              |
 data       | jsonb                    |           |          |                                       | extended |              |
 created_at | timestamp with time zone |           | not null |                                       | plain    |              |
Partition of: solarify_datapoint FOR VALUES IN (2)
Partition constraint: ((station_id IS NOT NULL) AND (station_id = 2))
Indexes:
    "datapoint_s2_station_id_device_id_created_at_key" UNIQUE CONSTRAINT, btree (station_id, device_id, created_at)
Foreign-key constraints:
    "datapoint_device_id_fk" FOREIGN KEY (device_id) REFERENCES device(id) DEFERRABLE INITIALLY DEFERRED
    "datapoint_station_id_fk" FOREIGN KEY (station_id) REFERENCES station(id) DEFERRABLE INITIALLY DEFERRED
...