Skip to content

fix slow single-value array-contains filter on multi-valued properties#535

Open
cportele wants to merge 1 commit into
masterfrom
fix-acontains-single-value-having
Open

fix slow single-value array-contains filter on multi-valued properties#535
cportele wants to merge 1 commit into
masterfrom
fix-acontains-single-value-having

Conversation

@cportele

Copy link
Copy Markdown
Contributor

A_CONTAINS on a multi-valued property is encoded as

... IN (<values>) GROUP BY <id> HAVING count(distinct <col>) = <n>

For a single value n is 1 and the HAVING is tautological: every group selected by IN (<one value>) trivially has one distinct value, so the predicate is always true.

PostgreSQL has no selectivity estimate for a post-aggregate count(distinct) filter and falls back to a tiny default row count. That misestimate can drive a nested-loop plan that re-evaluates other predicates per row (for example a large id membership set), making the query extremely slow.

Drop the redundant HAVING for the single-value case (equivalent to the A_OVERLAPS encoding) so the planner sees an accurate grouped-row count. Multi-value filters keep the HAVING, which remains semantically required.

A_CONTAINS on a multi-valued property is encoded as
  ... IN (<values>) GROUP BY <id> HAVING count(distinct <col>) = <n>
For a single value n is 1 and the HAVING is tautological: every group
selected by IN (<one value>) trivially has one distinct value, so the
predicate is always true.

PostgreSQL has no selectivity estimate for a post-aggregate count(distinct)
filter and falls back to a tiny default row count. That misestimate can
drive a nested-loop plan that re-evaluates other predicates per row (for
example a large id membership set), making the query extremely slow.

Drop the redundant HAVING for the single-value case (equivalent to the
A_OVERLAPS encoding) so the planner sees an accurate grouped-row count.
Multi-value filters keep the HAVING, which remains semantically required.
@cportele cportele requested a review from azahnen as a code owner June 16, 2026 21:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant