Re: BUG #17871: JIT during postgresql_fdw remote_estimates EXPLAIN have very negatively effect on planning time - Mailing list pgsql-bugs
From | Maxim Boguk |
---|---|
Subject | Re: BUG #17871: JIT during postgresql_fdw remote_estimates EXPLAIN have very negatively effect on planning time |
Date | |
Msg-id | CAK-MWwT0yCZZtkUTcuc5iCYcBJF0h-Mjoofs+X5fsCW69=4qzg@mail.gmail.com Whole thread Raw |
In response to | Re: BUG #17871: JIT during postgresql_fdw remote_estimates EXPLAIN have very negatively effect on planning time (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: BUG #17871: JIT during postgresql_fdw remote_estimates EXPLAIN have very negatively effect on planning time
|
List | pgsql-bugs |
On Tue, Mar 28, 2023 at 1:53 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
PG Bug reporting form <noreply@postgresql.org> writes:
> Checking what's going on the remote side leads to the following results:
> remote estimate explain calls from fdw with jit=on
> [EXPLAIN] LOG: duration: 97.050 ms statement: EXPLAIN SELECT topic_id,
> review_id, move_to_invitation_state_time, no_interview_reply_time,
> review_suggestion_chat_message_creation_time FROM
> public.interview_review_info_archive
> vs
> remote estimate explain calls from fdw with jit=off
> [EXPLAIN] LOG: duration: 3.343 ms statement: EXPLAIN SELECT topic_id,
> review_id, move_to_invitation_state_time, no_interview_reply_time,
> review_suggestion_chat_message_creation_time FROM
> public.interview_review_info_archive
Do you see the same discrepancy when you execute EXPLAIN manually
on the remote side? If so, I wouldn't blame postgres_fdw for it.
I suppose interview_review_info_archive is a view not a plain table?
In either case, could we see the DDL definition for it?
regards, tom lane
Hi,
During an attempt to create a minimal test case I discovered an effect for which I have no explanation:
(all tests with jit=on):
Run EXPLAIN on the single partition, so far expected results...
explain select * from interview_review_info_archive_p028;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Seq Scan on interview_review_info_archive_p028 (cost=0.00..361819.08 rows=34546848 width=40)
JIT:
Functions: 2
Options: Inlining true, Optimization true, Expressions true, Deforming true
QUERY PLAN
-----------------------------------------------------------------------------------------------
Seq Scan on interview_review_info_archive_p028 (cost=0.00..361819.08 rows=34546848 width=40)
JIT:
Functions: 2
Options: Inlining true, Optimization true, Expressions true, Deforming true
Prepare stand alone copy table with all data:
create table tables_to_drop.test as select * from interview_review_info_archive_p028;
vacuum ANALYZE tables_to_drop.test;
explain select * from tables_to_drop.test;
QUERY PLAN
-----------------------------------------------------------------
Seq Scan on test (cost=0.00..361908.72 rows=34562312 width=40)
QUERY PLAN
-----------------------------------------------------------------
Seq Scan on test (cost=0.00..361908.72 rows=34562312 width=40)
The same cost/same data/same query/same structure but no JIT triggered?
Add the same indexes as exists on interview_review_info_archive_p028:
alter table tables_to_drop.test add constraint test_pk primary key (topic_id);
create unique index test_uniq on tables_to_drop.test(review_id, topic_id) WHERE review_id IS NOT NULL);
vacuum ANALYZE tables_to_drop.test;
And still no JIT triggered during EXPLAIN.
Making sure that the both tables contain exactly the same data in exactly the same order:
cluster tables_to_drop.test using test_pk;
analyze verbose tables_to_drop.test;
cluster interview_review_info_archive_p028 using interview_review_info_archive_p028_pkey;
analyze verbose interview_review_info_archive_p028;
No changes:
negotiation_chat_archive=# explain select * from interview_review_info_archive_p028;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Seq Scan on interview_review_info_archive_p028 (cost=0.00..361921.00 rows=34563080 width=40)
JIT:
Functions: 2
Options: Inlining true, Optimization true, Expressions true, Deforming true
QUERY PLAN
-----------------------------------------------------------------------------------------------
Seq Scan on interview_review_info_archive_p028 (cost=0.00..361921.00 rows=34563080 width=40)
JIT:
Functions: 2
Options: Inlining true, Optimization true, Expressions true, Deforming true
negotiation_chat_archive=# explain select * from tables_to_drop.test;
QUERY PLAN
-----------------------------------------------------------------
Seq Scan on test (cost=0.00..361922.08 rows=34563208 width=40)
QUERY PLAN
-----------------------------------------------------------------
Seq Scan on test (cost=0.00..361922.08 rows=34563208 width=40)
Add check constraint on test table similar to exists on partition interview_review_info_archive_p028:
alter table tables_to_drop.test add constraint test_chk check ((topic_id IS NOT NULL) AND (topic_id >= '2700000000'::bigint) AND (topic_id < '2800000000'::bigint));
And still not JIT on standalone table.
Final structure of tables:
negotiation_chat_archive=# \d+ interview_review_info_archive_p028
Table "public.interview_review_info_archive_p028"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------------------------------------------+-----------------------------+-----------+----------+---------+---------+--------------+-------------
topic_id | bigint | | not null | | plain | |
review_id | bigint | | | | plain | |
move_to_invitation_state_time | timestamp without time zone | | | | plain | |
no_interview_reply_time | timestamp without time zone | | | | plain | |
review_suggestion_chat_message_creation_time | timestamp without time zone | | | | plain | |
Partition of: interview_review_info_archive FOR VALUES FROM ('2700000000') TO ('2800000000')
Partition constraint: ((topic_id IS NOT NULL) AND (topic_id >= '2700000000'::bigint) AND (topic_id < '2800000000'::bigint))
Indexes:
"interview_review_info_archive_p028_pkey" PRIMARY KEY, btree (topic_id) CLUSTER
"interview_review_info_archive_p028_review_id_topic_id_idx" UNIQUE, btree (review_id, topic_id) WHERE review_id IS NOT NULL
Access method: heap
Table "public.interview_review_info_archive_p028"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------------------------------------------+-----------------------------+-----------+----------+---------+---------+--------------+-------------
topic_id | bigint | | not null | | plain | |
review_id | bigint | | | | plain | |
move_to_invitation_state_time | timestamp without time zone | | | | plain | |
no_interview_reply_time | timestamp without time zone | | | | plain | |
review_suggestion_chat_message_creation_time | timestamp without time zone | | | | plain | |
Partition of: interview_review_info_archive FOR VALUES FROM ('2700000000') TO ('2800000000')
Partition constraint: ((topic_id IS NOT NULL) AND (topic_id >= '2700000000'::bigint) AND (topic_id < '2800000000'::bigint))
Indexes:
"interview_review_info_archive_p028_pkey" PRIMARY KEY, btree (topic_id) CLUSTER
"interview_review_info_archive_p028_review_id_topic_id_idx" UNIQUE, btree (review_id, topic_id) WHERE review_id IS NOT NULL
Access method: heap
vs
negotiation_chat_archive=# \d+ tables_to_drop.test
Table "tables_to_drop.test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------------------------------------------+-----------------------------+-----------+----------+---------+---------+--------------+-------------
topic_id | bigint | | not null | | plain | |
review_id | bigint | | | | plain | |
move_to_invitation_state_time | timestamp without time zone | | | | plain | |
no_interview_reply_time | timestamp without time zone | | | | plain | |
review_suggestion_chat_message_creation_time | timestamp without time zone | | | | plain | |
Indexes:
"test_pk" PRIMARY KEY, btree (topic_id) CLUSTER
"test_uniq" UNIQUE, btree (review_id, topic_id) WHERE review_id IS NOT NULL
Check constraints:
"test_chk" CHECK (topic_id IS NOT NULL AND topic_id >= '2700000000'::bigint AND topic_id < '2800000000'::bigint)
Access method: heap
Table "tables_to_drop.test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------------------------------------------+-----------------------------+-----------+----------+---------+---------+--------------+-------------
topic_id | bigint | | not null | | plain | |
review_id | bigint | | | | plain | |
move_to_invitation_state_time | timestamp without time zone | | | | plain | |
no_interview_reply_time | timestamp without time zone | | | | plain | |
review_suggestion_chat_message_creation_time | timestamp without time zone | | | | plain | |
Indexes:
"test_pk" PRIMARY KEY, btree (topic_id) CLUSTER
"test_uniq" UNIQUE, btree (review_id, topic_id) WHERE review_id IS NOT NULL
Check constraints:
"test_chk" CHECK (topic_id IS NOT NULL AND topic_id >= '2700000000'::bigint AND topic_id < '2800000000'::bigint)
Access method: heap
Only difference is
Partition of: interview_review_info_archive FOR VALUES FROM ('2700000000') TO ('2800000000')
Somehow being part of partition structure triggering JIT during EXPLAIN even if table used as standalone (e.g. called directly not via partition root) in query.
--
Maxim Boguk
Senior Postgresql DBA
https://dataegret.com/
Phone UA: +380 99 143 0000
Phone AU: +61 45 218 5678
Senior Postgresql DBA
https://dataegret.com/
Phone UA: +380 99 143 0000
Phone AU: +61 45 218 5678
pgsql-bugs by date:
Previous
From: Tom LaneDate:
Subject: Re: BUG #17871: JIT during postgresql_fdw remote_estimates EXPLAIN have very negatively effect on planning time
Next
From: David RowleyDate:
Subject: Re: BUG #17871: JIT during postgresql_fdw remote_estimates EXPLAIN have very negatively effect on planning time