Re: Major performance degradation with joins in 15.8 or 15.7?

From: Ed Sabol <edwardjsabol(at)gmail(dot)com>
To: pgsql-performance(at)lists(dot)postgresql(dot)org
Subject: Re: Major performance degradation with joins in 15.8 or 15.7?
Date: 2024-11-08 01:21:52
Message-ID: 7A0AB841-65F3-4317-905C-E98D45953E3E@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

On Nov 7, 2024, at 5:18 PM, David Rowley <dgrowleyml(at)gmail(dot)com> wrote:
> It's impossible to say with the given information. You didn't mention
> which version you upgraded from to start with.

Sorry, 15.6 to 15.7 to 15.8, but we weren't on 15.7 for very long before 15.8.

> You can set random_page_cost for just the session you're connected to
> and try it. SET random_page_cost = <old value>; before running
> EXPLAIN (ANALYZE, BUFFERS).

Oh, I didn't think of that. Duh. Here it is with random_page_cost = 4.0:

Nested Loop (cost=1216.49..11246.62 rows=1 width=112) (actual time=6374.844..6387.845 rows=1 loops=1)
Join Filter: (CASE WHEN ("position"(a.name, 'zz'::text) = 1) THEN a.name ELSE ('foo_'::text || a.name) END = "*SELECT* 1".table_name)
Rows Removed by Join Filter: 1009
Buffers: shared hit=2227268 read=426 dirtied=1
-> Nested Loop (cost=497.27..5499.27 rows=1 width=54) (actual time=23.852..84.444 rows=1010 loops=1)
Buffers: shared hit=24458 read=426 dirtied=1
-> Nested Loop (cost=496.85..5495.04 rows=1 width=76) (actual time=23.842..64.212 rows=1010 loops=1)
Buffers: shared hit=14591 read=426
-> Hash Join (cost=496.43..5490.81 rows=1 width=54) (actual time=23.823..40.587 rows=1010 loops=1)
Hash Cond: ((a.name || '.doc'::text) = b_1.name)
Buffers: shared hit=4724 read=426
-> Bitmap Heap Scan on metainfo a (cost=460.62..5400.28 rows=5471 width=38) (actual time=18.288..32.125 rows=1022 loops=1)
Recheck Cond: (relation = 'description'::text)
Filter: (type = 'table'::text)
Rows Removed by Filter: 37044
Heap Blocks: exact=3999
Buffers: shared hit=3614 read=425
-> Bitmap Index Scan on metainfo_r (cost=0.00..459.25 rows=39844 width=0) (actual time=17.623..17.624 rows=44615 loops=1)
Index Cond: (relation = 'description'::text)
Buffers: shared hit=3 read=37
-> Hash (cost=35.77..35.77 rows=3 width=38) (actual time=5.511..5.518 rows=1025 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 116kB
Buffers: shared hit=1110 read=1
-> Bitmap Heap Scan on metainfo b_1 (cost=23.96..35.77 rows=3 width=38) (actual time=1.225..4.206 rows=1025 loops=1)
Recheck Cond: ((relation = 'located'::text) AND (type = 'document'::text))
Heap Blocks: exact=1103
Buffers: shared hit=1110 read=1
-> BitmapAnd (cost=23.96..23.96 rows=3 width=0) (actual time=0.851..0.856 rows=0 loops=1)
Buffers: shared hit=7 read=1
-> Bitmap Index Scan on metainfo_r (cost=0.00..11.86 rows=991 width=0) (actual time=0.402..0.403 rows=1214 loops=1)
Index Cond: (relation = 'located'::text)
Buffers: shared hit=3 read=1
-> Bitmap Index Scan on metainfo_t (cost=0.00..11.86 rows=991 width=0) (actual time=0.343..0.344 rows=1214 loops=1)
Index Cond: (type = 'document'::text)
Buffers: shared hit=4
-> Index Scan using metainfo_n on metainfo c (cost=0.42..4.22 rows=1 width=22) (actual time=0.016..0.020 rows=1 loops=1010)
Index Cond: (name = a.name)
Filter: (relation = 'lastUpdated'::text)
Rows Removed by Filter: 48
Buffers: shared hit=9867
-> Index Scan using metainfo_n on metainfo d (cost=0.42..4.22 rows=1 width=22) (actual time=0.012..0.017 rows=1 loops=1010)
Index Cond: (name = a.name)
Filter: (relation = 'rowcount'::text)
Rows Removed by Filter: 48
Buffers: shared hit=9867 dirtied=1
-> Append (cost=719.22..5747.30 rows=2 width=64) (actual time=6.222..6.228 rows=1 loops=1010)
Buffers: shared hit=2202810
-> Subquery Scan on "*SELECT* 1" (cost=719.22..3653.48 rows=1 width=64) (actual time=5.358..5.358 rows=0 loops=1010)
Buffers: shared hit=1381680
-> Bitmap Heap Scan on metainfo (cost=719.22..3653.47 rows=1 width=96) (actual time=5.356..5.356 rows=0 loops=1010)
Recheck Cond: ((relation = ANY ('{start_time,end_time,dataset_id_column,dataset_id_prefix,original_mission_name,defaultSearchRadius,author,tableType,bibcode,priority,regime,author,include
sTypes,Mission,subject}'::text[])) AND (type = 'table'::text))
Filter: ((CASE relation WHEN 'Mission'::text THEN upper(value) ELSE value END = 'foo'::text) AND (CASE relation WHEN 'defaultSearchRadius'::text THEN 'default_search_radius'::text WHEN 'Mission'::text THEN 'o_name'::text WHEN 'priority'::text THEN 'table_priority'::text WHEN 'bibcode'::text THEN 'catalog_bibcode'::text WHEN 'regime'::text THEN 'frequency_regime'::text WHEN 'author'::text THEN 'table_author'::text WHEN 'tableType'::text THEN 'table_type'::text WHEN 'subject'::text THEN 'row_type'::text ELSE relation END = 'o_name'::text))
Rows Removed by Filter: 8253
Heap Blocks: exact=1277650
Buffers: shared hit=1381680
-> BitmapAnd (cost=719.18..719.18 rows=1361 width=0) (actual time=2.744..2.744 rows=0 loops=1010)
Buffers: shared hit=104030
-> Bitmap Index Scan on metainfo_r (cost=0.00..140.70 rows=9910 width=0) (actual time=0.495..0.495 rows=9896 loops=1010)
Index Cond: (relation = ANY ('{start_time,end_time,dataset_id_column,dataset_id_prefix,original_mission_name,defaultSearchRadius,author,tableType,bibcode,priority,regime,author,includesTypes,Mission,subject}'::text[]))
Buffers: shared hit=49490
-> Bitmap Index Scan on metainfo_t (cost=0.00..578.23 rows=50374 width=0) (actual time=2.198..2.198 rows=58833 loops=1010)
Index Cond: (type = 'table'::text)
Buffers: shared hit=54540
-> Subquery Scan on "*SELECT* 5" (cost=10.57..2093.81 rows=1 width=64) (actual time=0.862..0.867 rows=1 loops=1010)
Buffers: shared hit=821130
-> Bitmap Heap Scan on metainfo metainfo_1 (cost=10.57..2093.80 rows=1 width=96) (actual time=0.861..0.864 rows=1 loops=1010)
Recheck Cond: (relation = 'containedBy'::text)
Filter: ((substr(value, 1, 8) = 'mission:'::text) AND (upper("substring"(value, 9)) = 'foo'::text))
Rows Removed by Filter: 721
Heap Blocks: exact=818100
Buffers: shared hit=821130
-> Bitmap Index Scan on metainfo_r (cost=0.00..10.56 rows=819 width=0) (actual time=0.076..0.076 rows=895 loops=1010)
Index Cond: (relation = 'containedBy'::text)
Buffers: shared hit=3030
Planning:
Buffers: shared hit=64
Planning Time: 4.449 ms
Execution Time: 6388.155 ms
(78 rows)

And here it is with random_page_cost = 2.0:

Nested Loop (cost=3695.45..7241.35 rows=1 width=112) (actual time=35.046..49.115 rows=1 loops=1)
Buffers: shared hit=14243
-> Nested Loop (cost=3695.03..7238.89 rows=1 width=70) (actual time=35.029..49.093 rows=1 loops=1)
Join Filter: (CASE WHEN ("position"(a.name, 'zz'::text) = 1) THEN a.name ELSE ('foo_'::text || a.name) END = "*SELECT* 1".table_name)
Rows Removed by Join Filter: 1009
Buffers: shared hit=14239
-> Nested Loop (cost=3105.81..3627.24 rows=13 width=38) (actual time=6.688..37.136 rows=1010 loops=1)
Join Filter: (c.name = a.name)
Buffers: shared hit=12058
-> Merge Join (cost=3105.39..3116.74 rows=53 width=44) (actual time=6.648..10.798 rows=1010 loops=1)
Merge Cond: (c.name = d.name)
Buffers: shared hit=2200
-> Sort (cost=1546.41..1549.10 rows=1076 width=22) (actual time=3.618..4.357 rows=1010 loops=1)
Sort Key: c.name
Sort Method: quicksort Memory: 78kB
Buffers: shared hit=1101
-> Bitmap Heap Scan on metainfo c (cost=12.76..1492.22 rows=1076 width=22) (actual time=0.413..2.446 rows=1010 loops=1)
Recheck Cond: (relation = 'lastUpdated'::text)
Heap Blocks: exact=1097
Buffers: shared hit=1101
-> Bitmap Index Scan on metainfo_r (cost=0.00..12.49 rows=1076 width=0) (actual time=0.250..0.251 rows=1200 loops=1)
Index Cond: (relation = 'lastUpdated'::text)
Buffers: shared hit=4
-> Sort (cost=1558.98..1561.70 rows=1088 width=22) (actual time=3.022..3.820 rows=1010 loops=1)
Sort Key: d.name
Sort Method: quicksort Memory: 78kB
Buffers: shared hit=1099
-> Bitmap Heap Scan on metainfo d (cost=12.85..1504.11 rows=1088 width=22) (actual time=0.384..1.886 rows=1010 loops=1)
Recheck Cond: (relation = 'rowcount'::text)
Heap Blocks: exact=1095
Buffers: shared hit=1099
-> Bitmap Index Scan on metainfo_r (cost=0.00..12.58 rows=1088 width=0) (actual time=0.236..0.237 rows=1200 loops=1)
Index Cond: (relation = 'rowcount'::text)
Buffers: shared hit=4
-> Index Scan using metainfo_n on metainfo a (cost=0.42..9.62 rows=1 width=38) (actual time=0.018..0.023 rows=1 loops=1010)
Index Cond: (name = d.name)
Filter: ((relation = 'description'::text) AND (type = 'table'::text))
Rows Removed by Filter: 48
Buffers: shared hit=9858
-> Materialize (cost=589.22..3611.08 rows=2 width=64) (actual time=0.009..0.009 rows=1 loops=1010)
Buffers: shared hit=2181
-> Append (cost=589.22..3611.07 rows=2 width=64) (actual time=7.847..7.870 rows=1 loops=1)
Buffers: shared hit=2181
-> Subquery Scan on "*SELECT* 1" (cost=589.22..2395.08 rows=1 width=64) (actual time=6.935..6.944 rows=0 loops=1)
Buffers: shared hit=1368
-> Bitmap Heap Scan on metainfo (cost=589.22..2395.07 rows=1 width=96) (actual time=6.933..6.940 rows=0 loops=1)
Recheck Cond: ((relation = ANY ('{start_time,end_time,dataset_id_column,dataset_id_prefix,original_mission_name,defaultSearchRadius,author,tableType,bibcode,priority,regime,author,includesTypes,Mission,subject}'::text[])) AND (type = 'table'::text))
Filter: ((CASE relation WHEN 'Mission'::text THEN upper(value) ELSE value END = 'foo'::text) AND (CASE relation WHEN 'defaultSearchRadius'::text THEN 'default_search_radius'::text WHEN 'Mission'::text THEN 'o_name'::text WHEN 'priority'::text THEN 'table_priority'::text WHEN 'bibcode'::text THEN 'catalog_bibcode'::text WHEN 'regime'::text THEN 'frequency_regime'::text WHEN 'author'::text THEN 'table_author'::text WHEN 'tableType'::text THEN 'table_type'::text WHEN 'subject'::text THEN 'row_type'::text ELSE relation END = 'o_name'::text))
Rows Removed by Filter: 8253
Heap Blocks: exact=1265
Buffers: shared hit=1368
-> BitmapAnd (cost=589.18..589.18 rows=1361 width=0) (actual time=3.406..3.412 rows=0 loops=1)
Buffers: shared hit=103
-> Bitmap Index Scan on metainfo_r (cost=0.00..110.70 rows=9910 width=0) (actual time=0.638..0.638 rows=9897 loops=1)
Index Cond: (relation = ANY ('{start_time,end_time,dataset_id_column,dataset_id_prefix,original_mission_name,defaultSearchRadius,author,tableType,bibcode,priority,regime,author,includesTypes,Mission,subject}'::text[]))
Buffers: shared hit=49
-> Bitmap Index Scan on metainfo_t (cost=0.00..478.23 rows=50374 width=0) (actual time=2.688..2.690 rows=58842 loops=1)
Index Cond: (type = 'table'::text)
Buffers: shared hit=54
-> Subquery Scan on "*SELECT* 5" (cost=8.57..1215.97 rows=1 width=64) (actual time=0.909..0.919 rows=1 loops=1)
Buffers: shared hit=813
-> Bitmap Heap Scan on metainfo metainfo_1 (cost=8.57..1215.96 rows=1 width=96) (actual time=0.907..0.914 rows=1 loops=1)
Recheck Cond: (relation = 'containedBy'::text)
Filter: ((substr(value, 1, 8) = 'mission:'::text) AND (upper("substring"(value, 9)) = 'foo'::text))
Rows Removed by Filter: 721
Heap Blocks: exact=810
Buffers: shared hit=813
-> Bitmap Index Scan on metainfo_r (cost=0.00..8.56 rows=819 width=0) (actual time=0.085..0.085 rows=895 loops=1)
Index Cond: (relation = 'containedBy'::text)
Buffers: shared hit=3
-> Index Scan using metainfo_n on metainfo b_1 (cost=0.42..2.44 rows=1 width=38) (actual time=0.011..0.012 rows=1 loops=1)
Index Cond: (name = (a.name || '.doc'::text))
Filter: ((relation = 'located'::text) AND (type = 'document'::text))
Buffers: shared hit=4
Planning:
Buffers: shared hit=367
Planning Time: 5.391 ms
Execution Time: 49.412 ms
(78 rows)

Thanks,
Ed

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Andrei Lepikhov 2024-11-08 02:27:28 Re: Major performance degradation with joins in 15.8 or 15.7?
Previous Message David Rowley 2024-11-07 22:18:21 Re: Major performance degradation with joins in 15.8 or 15.7?