Optimize sys.indexes index_id computation for correlated subquery access#4849
Open
RuchaSK1 wants to merge 4 commits into
Open
Optimize sys.indexes index_id computation for correlated subquery access#4849RuchaSK1 wants to merge 4 commits into
RuchaSK1 wants to merge 4 commits into
Conversation
added 4 commits
June 3, 2026 19:13
Signed-off-by: Rucha Kulkarni <ruchask@amazon.com>
Signed-off-by: Rucha Kulkarni <ruchask@amazon.com>
Signed-off-by: Rucha Kulkarni <ruchask@amazon.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
sys.indexescomputesindex_idusing a materialized CTE withrow_number(). TheMATERIALIZEDkeyword forces PostgreSQL to evaluate all indexes in the database upfront, regardless of how many are actually needed by the caller.This is efficient for bulk access (
SELECT * FROM sys.indexes) but becomes a bottleneck whensys.indexesis accessed per-row in correlated subqueries which is a pattern in SSMS Expanding tables query.In such cases, the full CTE is scanned repeatedly (once per outer row), leading to execution times that grow linearly with both the number of tables and total indexes in the database.
Fix
We replace the materialized CTE with an inline scalar subquery that computes
index_idon demand by counting sibling indexes viapg_index_indrelid_index:index_id = 12 + count of earlier non-clustered indexes on the same tableFor per-row access, this reads only the 1-2 sibling indexes on the same table.
Performance Testing
Tested on 17.10 instance with ~37K objects (7,500 tables, 15,751 indexes).
SELECT t.name, i.name FROM sys.tables t JOIN sys.indexes i ON t.object_id = i.object_id AND i.index_id = 1 WHERE t.is_ms_shipped = 0SELECT t.name, i.name, i.index_id FROM sys.tables t JOIN sys.indexes i ON t.object_id = i.object_id WHERE t.is_ms_shipped = 0(all indexes per table)SELECT * FROM sys.indexes(bulk, all 15751 indexes)Issues Resolved
Task: BABEL-6816
Authored-by: Rucha Kulkarni ruchask@amazon.com
Signed-off-by: Rucha Kulkarni ruchask@amazon.com
Test Scenarios Covered
Use case based -
Boundary conditions -
Arbitrary inputs -
Negative test cases -
Minor version upgrade tests -
Major version upgrade tests -
Performance tests - Yes
Tooling impact -
Client tests -
Check List
By submitting this pull request, I confirm that my contribution is under the terms of the Apache 2.0 and PostgreSQL licenses, and grant any person obtaining a copy of the contribution permission to relicense all or a portion of my contribution to the PostgreSQL License solely to contribute all or a portion of my contribution to the PostgreSQL open source project.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.