Bird
Raised Fist0
PostgreSQLquery~10 mins

Partial indexes with WHERE clause in PostgreSQL - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Partial indexes with WHERE clause
Start: Create Index
Check WHERE condition
Yes
Include row in index
No
Skip row
Repeat for all rows
Index created with subset of rows
The database creates an index only for rows that meet the WHERE condition, skipping others.
Execution Sample
PostgreSQL
CREATE INDEX idx_active_users ON users (last_login) WHERE active = true;
Creates an index on last_login only for users where active is true.
Execution Table
StepRow Data (active, last_login)WHERE Condition (active = true)ActionIndex State
1(true, '2024-06-01')trueInclude in indexIndex contains last_login for this row
2(false, '2024-05-20')falseSkip rowNo change
3(true, '2024-06-03')trueInclude in indexIndex updated with last_login for this row
4(false, '2024-04-15')falseSkip rowNo change
5(true, '2024-06-02')trueInclude in indexIndex updated with last_login for this row
6All rows processed--Index creation complete with partial rows
💡 All rows checked; only rows with active = true included in index
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5Final
Index contentsemptylast_login='2024-06-01'last_login='2024-06-01'last_login='2024-06-01','2024-06-03'last_login='2024-06-01','2024-06-03'last_login='2024-06-01','2024-06-03','2024-06-02'last_login='2024-06-01','2024-06-03','2024-06-02'
Key Moments - 3 Insights
Why are some rows skipped when creating the index?
Rows are skipped because they do not meet the WHERE condition (active = true), as shown in execution_table rows 2 and 4 where the condition is false and the action is to skip.
Does the index include all rows from the table?
No, the index only includes rows where the WHERE clause is true. The execution_table shows only rows with active = true are included.
What happens if the WHERE clause is omitted?
If omitted, the index includes all rows. Here, the WHERE clause filters rows, so only a subset is indexed.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 3. What is the action taken for the row with data (true, '2024-06-03')?
ASkip row
BInclude in index
CUpdate row
DDelete row
💡 Hint
Check the 'Action' column in execution_table row 3.
At which step does the index first get updated with a row's last_login value?
AStep 4
BStep 2
CStep 1
DStep 6
💡 Hint
Look at the 'Index State' column in execution_table rows 1 and 2.
If the WHERE clause was changed to active = false, how would the index contents change after step 5?
AIndex would contain last_login values from rows where active is false
BIndex would be empty
CIndex would contain all rows
DIndex would contain last_login values from rows where active is true
💡 Hint
Refer to variable_tracker and execution_table to see how WHERE condition controls included rows.
Concept Snapshot
Partial Indexes with WHERE clause:
CREATE INDEX index_name ON table(column) WHERE condition;
Only rows matching condition are indexed.
Improves performance by indexing relevant subset.
Saves space and speeds queries filtering on condition.
Full Transcript
Partial indexes in PostgreSQL allow creating an index on only a subset of table rows that meet a specific condition defined by a WHERE clause. During index creation, each row is checked against the WHERE condition. If the condition is true, the row's indexed column value is included in the index. If false, the row is skipped. This results in a smaller, more efficient index that speeds up queries filtering on the condition. For example, creating an index on last_login for only active users includes only those rows where active is true. Rows where active is false are not indexed. This selective indexing saves space and improves query speed for relevant data.

Practice

(1/5)
1. What is the main purpose of a partial index with a WHERE clause in PostgreSQL?
easy
A. To index only rows that meet a specific condition
B. To index all rows in the table regardless of condition
C. To create a backup of the table
D. To delete rows that do not meet the condition

Solution

  1. Step 1: Understand partial index concept

    A partial index indexes only a subset of rows based on a condition.
  2. Step 2: Role of WHERE clause

    The WHERE clause defines which rows to include in the index.
  3. Final Answer:

    To index only rows that meet a specific condition -> Option A
  4. Quick Check:

    Partial index = conditional indexing [OK]
Hint: Partial indexes use WHERE to limit indexed rows [OK]
Common Mistakes:
  • Thinking partial indexes index all rows
  • Confusing partial index with table backup
  • Assuming partial index deletes rows
2. Which of the following is the correct syntax to create a partial index on a table orders for rows where status = 'pending'?
easy
A. CREATE INDEX idx_pending ON orders (status) WHERE status = 'pending';
B. CREATE INDEX idx_pending ON orders WHERE status = 'pending';
C. CREATE INDEX idx_pending ON orders WHERE status = 'pending' (status);
D. CREATE INDEX idx_pending ON orders (status) WHERE status == 'pending';

Solution

  1. Step 1: Check index creation syntax

    CREATE INDEX requires index name, table, columns, and optional WHERE clause.
  2. Step 2: Validate WHERE clause and operators

    Use single equals (=) for comparison, and specify columns to index.
  3. Final Answer:

    CREATE INDEX idx_pending ON orders (status) WHERE status = 'pending'; -> Option A
  4. Quick Check:

    Correct syntax includes columns and WHERE with = [OK]
Hint: Include columns before WHERE; use single = for condition [OK]
Common Mistakes:
  • Omitting columns in index definition
  • Using double equals (==) instead of single =
  • Placing WHERE before columns
3. Given the partial index:
CREATE INDEX idx_active_users ON users (last_login) WHERE active = true;
What will be the result of this query?
SELECT * FROM users WHERE active = true AND last_login > '2024-01-01';
medium
A. The query will return no rows because partial indexes exclude all rows
B. The query will ignore the partial index and perform a full table scan
C. The query will cause a syntax error due to the partial index
D. The query will use the partial index and return matching rows quickly

Solution

  1. Step 1: Understand partial index condition

    The index covers rows where active = true, indexing last_login.
  2. Step 2: Analyze query filter

    The query filters on active = true and last_login > '2024-01-01', matching the index condition.
  3. Final Answer:

    The query will use the partial index and return matching rows quickly -> Option D
  4. Quick Check:

    Query matches partial index condition = uses index [OK]
Hint: Query filters must match partial index WHERE to use it [OK]
Common Mistakes:
  • Assuming partial index causes syntax errors
  • Thinking partial index excludes all rows
  • Believing query ignores partial index if condition partially matches
4. You created a partial index:
CREATE INDEX idx_recent_orders ON orders (order_date) WHERE order_date > CURRENT_DATE - INTERVAL '30 days';
But queries filtering order_date > CURRENT_DATE - INTERVAL '30 days' are not using the index. What is the likely problem?
medium
A. Partial indexes cannot use date intervals
B. The index is missing the column order_date
C. The partial index condition uses a non-immutable function, so it cannot be used
D. The WHERE clause in the index is invalid syntax

Solution

  1. Step 1: Check partial index WHERE clause

    The WHERE clause uses CURRENT_DATE, which is non-immutable (changes daily).
  2. Step 2: Understand index usage limitation

    PostgreSQL partial indexes require immutable conditions to be used by queries.
  3. Final Answer:

    The partial index condition uses a non-immutable function, so it cannot be used -> Option C
  4. Quick Check:

    Non-immutable functions block partial index usage [OK]
Hint: Partial index WHERE must use immutable expressions [OK]
Common Mistakes:
  • Assuming syntax error causes issue
  • Thinking partial indexes can't use date columns
  • Ignoring function immutability rules
5. You want to speed up queries on a products table filtering only active products with price < 100. Which partial index is best to create?
hard
A. CREATE INDEX idx_active_price ON products (price);
B. CREATE INDEX idx_active_price ON products (price) WHERE active = true AND price < 100;
C. CREATE INDEX idx_active_price ON products (price) WHERE active = true OR price < 100;
D. CREATE INDEX idx_active_price ON products WHERE active = true AND price < 100;

Solution

  1. Step 1: Define index condition matching query filters

    The query filters active = true AND price < 100, so index WHERE must match both.
  2. Step 2: Check syntax and columns

    Index must specify columns (price) and use AND in WHERE clause for correct filtering.
  3. Final Answer:

    CREATE INDEX idx_active_price ON products (price) WHERE active = true AND price < 100; -> Option B
  4. Quick Check:

    Partial index WHERE matches query filters exactly [OK]
Hint: Use AND in WHERE to match all query conditions [OK]
Common Mistakes:
  • Using OR instead of AND in WHERE clause
  • Omitting columns in index definition
  • Trying to create index without columns