-
Notifications
You must be signed in to change notification settings - Fork 67
Вставка за один раз больше 50000 строк. ERROR: bogus varno: 65001 #112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Добрый день, Сергей! Вы можете предоставить нам (упрощенную) схему таблицы или какой-нибудь скрипт, чтобы мы могли ускорить воспроизведение проблемы? |
Еще не помешал бы EXPLAIN обоих вариантов |
всё подготовлю завтра... |
Я смог добиться повторения этой ошибки :) Моё окружение:
--
|
Не воспроизводится на следующих конфигурациях:
В самом начале партиция только одна: issue_112=# table pathman_partition_list ;
parent | partition | parttype | expr | range_min | range_max
------------------+--------------------+----------+------------+---------------------+---------------------
base.fact_events | base.fact_events_1 | 2 | created_at | 2008-01-01 00:00:00 | 2008-02-01 00:00:00
(1 row) Запрос выполняю тот же самый, план ничем не отличается: explain (COSTS)
INSERT INTO base.fact_events(id, rgu_service_id, rgu_authority_id, status, review_status, event_date, created_at, updated_at, email)
SELECT
ev.id, srv.id, au.id, ev.status, ev.review_status, ev.date, ev.created_at, ev.updated_at, ev.email::varchar(128)
FROM public.hershel_events AS ev
LEFT JOIN base.rgu_services AS srv ON srv.foreign_code = ev.service_reg_id
LEFT JOIN base.rgu_authorities AS au ON au.foreign_code = ev.authority_reg_id;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Insert on fact_events (cost=1976.67..45416.35 rows=1960784 width=390)
-> Custom Scan (PartitionFilter) (cost=1976.67..45416.35 rows=1960784 width=390)
-> Hash Right Join (cost=1976.67..45416.35 rows=1960784 width=390)
Hash Cond: ((au.foreign_code)::text = (ev.authority_reg_id)::text)
-> Seq Scan on rgu_authorities au (cost=0.00..293.00 rows=10000 width=20)
-> Hash (cost=513.67..513.67 rows=10000 width=1068)
-> Hash Right Join (cost=112.17..513.67 rows=10000 width=1068)
Hash Cond: ((srv.foreign_code)::text = (ev.service_reg_id)::text)
-> Seq Scan on rgu_services srv (cost=0.00..264.00 rows=10000 width=24)
-> Hash (cost=111.53..111.53 rows=51 width=1580)
-> Foreign Scan on hershel_events ev (cost=100.00..111.53 rows=51 width=1580)
(11 rows) Но вот результат совсем другой: INSERT INTO base.fact_events(id, rgu_service_id, rgu_authority_id, status, review_status, event_date, created_at, updated_at, email)
SELECT
ev.id, srv.id, au.id, ev.status, ev.review_status, ev.date, ev.created_at, ev.updated_at, ev.email::varchar(128)
FROM public.hershel_events AS ev
LEFT JOIN base.rgu_services AS srv ON srv.foreign_code = ev.service_reg_id
LEFT JOIN base.rgu_authorities AS au ON au.foreign_code = ev.authority_reg_id;
INSERT 0 473472
select count(*) from base.fact_events;
count
--------
473472
(1 row) Я думаю, данных условий не достаточно для воспроизведения проблемы. |
Может быть, вы используете какие-нибудь расширения? |
Попробую сделать бэкап кластера. |
Привет, INSERT INTO base.fact_events(id, rgu_service_id, rgu_authority_id, status, review_status, event_date, created_at, updated_at, email)
SELECT
ev.id, srv.id, au.id, ev.status, ev.review_status, ev.date, ev.created_at, ev.updated_at, ev.email::varchar(128)
FROM public.hershel_events AS ev
LEFT JOIN base.rgu_services AS srv ON srv.foreign_code = ev.service_reg_id
LEFT JOIN base.rgu_authorities AS au ON au.foreign_code = ev.authority_reg_id для приведения БД test_dst в исходное состояние, достаточно выполнить: drop TABLE base.fact_events cascade;
CREATE TABLE base.fact_events
(
id bigserial NOT NULL,
rgu_service_id integer,
rgu_authority_id integer,
status integer,
review_status integer,
created_at timestamp without time zone NOT NULL DEFAULT now(),
updated_at timestamp without time zone NOT NULL,
deleted_at timestamp without time zone,
event_date date,
token character varying(50),
mobile character varying(25),
email character varying(128),
CONSTRAINT fact_events_pkey PRIMARY KEY (id)
);
SELECT create_range_partitions('base.fact_events', 'created_at', '2008-01-01'::date, '1 month'::interval, 1); как только бэкап на cloud mail ru не нужен будет, сообщите... я его удалю. |
Я нашел проблему: мы не совсем правильно конструируем узел У меня проблема не воспроизводилась потому, что я не ставил auto_explain (который, очевидно, есть у вас). Если бы я сразу знал обо всех используемых расширениях, это сэкономило бы довольно много времени :( |
На самом деле проблема именно в использовании |
На будущее буду знать, что надо в окружении приводить полный список всех установленных расширений. |
Могу ли я уже удалить бэкап на cloud mail ru ? |
@sgrinko да, конечно. |
Вышла версия 1.4.3 с исправлением. |
Большое спасибо! |
Caused by: - 2489d76c4906f4461a364ca8ad7e0751ead8aa0d (PostgreSQL) Make Vars be outer-join-aware. - 8109191 (pg_pathman) fix bogus varno in PartitionFilter's targetlist (issue #112) - 92f0734 (pg_pathman) [PGPRO-7630] Post-processing for nodes added in plan tree by pathman PGPRO-5628: Port pg_proaudit to STD15 Tags: pg_pathman
Работаю на следующих версиях:
select get_pathman_lib_version()
10402
select version()
PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609, 64-bit
использую RANGE секционирование 1 месяц. Выполняю такой код:
ERROR: bogus varno: 65001
Если я разбиваю интервалы на меньшие, то всё проходит.
Получается, что ошибка возникает в случает, если интервал большой
По 50 тыщ записей работает, а по 100 тыщ - нет.
Мне нужно заливать данные в таблицу большими пакетами.
Если делать мелкими, то сильно возрастает время заливки.
The text was updated successfully, but these errors were encountered: