You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
...и так каждую из 66 созданных секций.
Итого имеем 1 базовую таблицу, 66 секций по периодам и каждая из них еще секционирована по 11 секциям по отделениям. Итого, pathman_partition_list выдает 792 секции, что правильно 66 + 66*11 = 792.
Теперь пишем такой скрипт и запускаем (на самом деле это упрощенная вырезка из тела функции, но суть от этого не меняется и ошибка полностью воспроизводится):
DO
$$
DECLARE
_f_division int=1;
_n_period int=201301;
BEGINDROPTABLE IF EXISTS Test;
CREATE TEMP TABLE Test ASSELECTTr.F_Division,
_n_period AS N_Period
FROMtest.test_table Tr
WHERE1=0;
LOOP
IF NOT (_N_Period <201810)
THEN
EXIT;
END IF;
RAISE NOTICE 'N_Period -> %', _n_period;
INSERT INTO Test
SELECTTr.F_Division,
_n_period AS N_Period
FROMtest.test_table Tr
WHERETr.f_division= _f_division
ANDTr.N_Period= _n_period;
_N_Period := CASE WHEN _N_Period % 100=12 THEN (_N_Period /100+1) *100+1 ELSE _N_Period +1 END;
END LOOP;
END;
$$;
Данный скрипт отваливается с ошибкой:
[2018-12-18 22:05:27] [XX000] ОШИБКА: variable not found in subplan target list
[2018-12-18 22:05:27] Где: SQL-оператор: "INSERT INTO Test[2018-12-18 22:05:27] SELECT[2018-12-18 22:05:27] Tr.F_Division,[2018-12-18 22:05:27] _n_period AS N_Period[2018-12-18 22:05:27] FROM test.test_table Tr[2018-12-18 22:05:27] WHERE Tr.f_division = _f_division[2018-12-18 22:05:27] AND Tr.N_Period = _n_period"
[2018-12-18 22:05:27] функция PL/pgSQL inline_code_block, строка 23, оператор SQL-оператор
[2018-12-18 22:05:27] [00000] таблица "test" не существует, пропускается
[2018-12-18 22:05:27] [00000] N_Period -> 201301
[2018-12-18 22:05:27] [00000] N_Period -> 201302
[2018-12-18 22:05:27] [00000] N_Period -> 201303
[2018-12-18 22:05:27] [00000] N_Period -> 201304
[2018-12-18 22:05:27] [00000] N_Period -> 201305
[2018-12-18 22:05:27] [00000] N_Period -> 201306
Обратите внимание, что цикл сломался на 6й итерации когда N_Period достиг 201306.
Теперь немного магии:
Если в коде исправить IF NOT (_N_Period < 201810) на IF NOT (_N_Period < 201306) то есть 5 циклов - все работает! Один циклом больше - ошибка!
Если в коде исправить Tr.f_division = _f_division на Tr.f_division = 1 то есть жестко захардкодить отделение - все работает!
Если в коде написать Join на таблицу отделений - тоже все работает. Вот так:
Заменить код
INSERT INTO Test
SELECTTr.F_Division,
_n_period AS N_Period
FROMtest.test_table Tr
WHERETr.f_division= _f_division
ANDTr.N_Period= _n_period;
на этот
INSERT INTO Test
SELECTTr.F_Division,
_n_period AS N_Period
FROMtest.test_table Tr
INNER JOINtest.divisions sd
ONsd.link=tr.f_divisionWHERETr.f_division= _f_division
ANDTr.N_Period= _n_period;
То есть по сути просто добавили бесполезное соединение - начинает работать!
Похоже где-то ошибка в планировщике.
Environment
SELECT * FROM pg_extension;
extname
extowner
extnamespace
extrelocatable
extversion
extconfig
extcondition
plpgsql
10
11
f
1.0
file_fdw
10
2200
t
1.0
pg_buffercache
10
2200
t
1.3
pg_stat_statements
10
2200
t
1.5
pg_variables
10
2200
t
1.1
tablefunc
10
2200
t
1.0
uuid-ossp
10
2200
t
1.1
pg_pathman
16384
2200
f
1.5
{119515229,119515240}
{"",""}
tds_fdw
16384
2200
t
2.0.0-alpha.2
plv8
16384
11
f
2.3.8
pg_query_state
16384
2200
t
1.1
bloom
16384
2200
t
1.0
SELECT version();
version
PostgreSQL 11.1 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, 64-bit
SELECT pgpro_version();
pgpro_version
PostgresPro 11.1.1 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, 64-bit
SELECT pgpro_edition();
pgpro_edition
standard
select pathman_version();
pathman_version
1.5.3
The text was updated successfully, but these errors were encountered:
Problem description
Начиная с версии 1.5 у вас имеется поддержка Multi-Level секционирования. Однако я обнаружил довольно интересную проблему.
Есть таблица секционированная по периодам (RANGE), по полю типа int формат записи 201301, 201302 ... 201810. Итого 66 секций!
Скрипт:
Затем каждая из секций дополнительно секционирована по другому полю типа int (HASH секционирование).
Скрипт на примере секции test.test_table_201301:
...и так каждую из 66 созданных секций.
Итого имеем 1 базовую таблицу, 66 секций по периодам и каждая из них еще секционирована по 11 секциям по отделениям. Итого, pathman_partition_list выдает 792 секции, что правильно 66 + 66*11 = 792.
Теперь пишем такой скрипт и запускаем (на самом деле это упрощенная вырезка из тела функции, но суть от этого не меняется и ошибка полностью воспроизводится):
Данный скрипт отваливается с ошибкой:
Обратите внимание, что цикл сломался на 6й итерации когда N_Period достиг 201306.
Теперь немного магии:
Заменить код
на этот
То есть по сути просто добавили бесполезное соединение - начинает работать!
Похоже где-то ошибка в планировщике.
Environment
SELECT * FROM pg_extension;
SELECT version();
SELECT pgpro_version();
SELECT pgpro_edition();
select pathman_version();
The text was updated successfully, but these errors were encountered: