Skip to content

features: materialize oversized result sets into a table#563

Open
cportele wants to merge 1 commit into
skip-empty-resultset-producersfrom
oversized-resultset-tables
Open

features: materialize oversized result sets into a table#563
cportele wants to merge 1 commit into
skip-empty-resultset-producersfrom
oversized-resultset-tables

Conversation

@cportele

Copy link
Copy Markdown
Contributor

Depends on #562

When a result set exceeds the materialization cap it could not be inlined as a literal IN list, so it fell back to re-deriving the producer inline in every consuming sub-query - the same multi-table producer (joins, spatial and temporal filters) re-run once per consumer, dozens of times for a shared set.

Materialize such a set once into an indexed, session-independent table and reference it from the consumers as IN (SELECT <value column> FROM <table>), so the producer runs a single time and each consumer only scans the table. The table-backed reference flows into both consumer and producer filters, so a chain of oversized sets references each other's tables. Gated on a dialect capability; dialects without it keep the inline re-evaluation fallback.

Table names are unique per request (a per-instance token plus a per-call sequence), so concurrent requests and multiple provider instances on the same database never collide. The names created for a request are collected and dropped when its feature stream completes, on success or error.

When a result set exceeds the materialization cap it could not be inlined as
a literal IN list, so it fell back to re-deriving the producer inline in
every consuming sub-query - the same multi-table producer (joins, spatial
and temporal filters) re-run once per consumer, dozens of times for a shared
set.

Materialize such a set once into an indexed, session-independent table and
reference it from the consumers as IN (SELECT <value column> FROM <table>),
so the producer runs a single time and each consumer only scans the table.
The table-backed reference flows into both consumer and producer filters, so
a chain of oversized sets references each other's tables. Gated on a dialect
capability; dialects without it keep the inline re-evaluation fallback.

Table names are unique per request (a per-instance token plus a per-call
sequence), so concurrent requests and multiple provider instances on the
same database never collide. The names created for a request are collected
and dropped when its feature stream completes, on success or error.
@cportele cportele requested a review from azahnen as a code owner June 29, 2026 11:39
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