Incorrect cost for MergeAppend
Alexander Kuzmenkov <akuzmenkov@timescale.com>
From: Alexander Kuzmenkov <akuzmenkov@timescale.com>
To: pgsql-hackers@postgresql.org
Date: 2024-01-29T12:40:41Z
Lists: pgsql-hackers
Hello hackers, While investigating some query plans, I noticed some code that seems to be wrong: when create_merge_append_path() estimates the cost of sorting an input, it calls cost_sort() passing subpath->parent->tuples as the number of tuples. Shouldn't it use subpath->parent->rows or even subpath->rows instead? The `tuples` variable doesn't account for the filters on the relation, so this leads to incorrect cost estimates when there are highly selective filters, and Sort + Append is chosen instead of MergeAppend. I don't have a good repro yet because the plans I've been studying involve a third-party extension, but the code looks incorrect so I thought I should ask. Here is a link to this code on GitHub: https://github.com/postgres/postgres/blob/6a1ea02c491d16474a6214603dce40b5b122d4d1/src/backend/optimizer/util/pathnode.c#L1469-L1477 --- Alexander Kuzmenkov Timescale
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix costing bug in MergeAppend
- 9d1a5354f58c 17.0 landed
-
Fix locking when fixing an incomplete split of a GIN internal page
- 6a1ea02c491d 17.0 cited