FG
๐Ÿ’ป Software๐Ÿค– AI & LLMs

index not used with cte

Fresh3 days ago
Mar 14, 20260 views
Confidence Score49%
49%

Problem

Index (ivfflat at least) are not used when the query is a cte : [code block] ==> [code block] Whereas the index is used using a subquery : [code block] [code block] Test on 0.80.0 pgvector and postgreSQL 15 (windows) Test on 0.80.0 pgvector and postgreSQL 17 (linux/docker)

Unverified for your environment

Select your OS to check compatibility.

1 Fix

Canonical Fix
Unverified Fix
New Fix โ€“ Awaiting Verification

Optimize CTE Queries to Utilize Indexes

Medium Risk

Commonly, PostgreSQL's query planner may not utilize indexes when dealing with Common Table Expressions (CTEs) due to the way CTEs are treated as optimization fences. This means that the planner may not consider the indexes available for the underlying tables when executing the CTE, leading to suboptimal query performance. In contrast, subqueries may allow the planner to better optimize the use of indexes.

Awaiting Verification

Be the first to verify this fix

  1. 1

    Rewrite CTE as Subquery

    Convert the CTE into a subquery to allow PostgreSQL to optimize the query plan and utilize the available indexes effectively.

    sql
    SELECT * FROM (SELECT ... FROM your_table WHERE ...) AS subquery;
  2. 2

    Analyze Query Performance

    Use the EXPLAIN command to analyze the performance of the rewritten query. This will help confirm that the index is being utilized as expected.

    sql
    EXPLAIN ANALYZE SELECT * FROM (SELECT ... FROM your_table WHERE ...) AS subquery;
  3. 3

    Check Index Usage

    Verify that the index (ivfflat) is being used in the execution plan. Look for 'Index Scan' in the output of the EXPLAIN command.

    sql
    EXPLAIN SELECT * FROM your_table WHERE your_vector_column <-> your_vector_value < threshold;
  4. 4

    Test Across Environments

    Run the optimized query on both PostgreSQL 15 and 17 environments to ensure consistent performance improvements and index usage across different setups.

    sql
    SELECT * FROM (SELECT ... FROM your_table WHERE ...) AS subquery;
  5. 5

    Monitor Performance Metrics

    After implementing the changes, monitor the performance metrics of the database to ensure that query execution times have improved and that the index is being utilized effectively.

    sql
    SELECT * FROM pg_stat_statements WHERE query LIKE '%your_table%';

Validation

Confirm that the rewritten query shows improved performance and that the index is used by checking the execution plan with EXPLAIN. Additionally, compare execution times before and after the changes to ensure that the fix has had the desired effect.

Sign in to verify this fix

Environment

Submitted by

AC

Alex Chen

2450 rep

Tags

pgvectorembeddingsvector-search