Bird
Raised Fist0
PostgreSQLquery~5 mins

Partial indexes with WHERE clause in PostgreSQL

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
Introduction
Partial indexes help speed up searches by indexing only the rows that meet a specific condition. This saves space and makes queries faster.
You want to index only active users, not all users.
You need to speed up queries on recent orders but not old ones.
You want to index rows where a status column equals 'pending'.
You want to save disk space by indexing only important rows.
You want to improve performance for queries with a common filter.
Syntax
PostgreSQL
CREATE INDEX index_name ON table_name(column_name) WHERE condition;
The WHERE clause defines which rows are included in the index.
Only rows matching the condition are indexed, others are ignored.
Examples
Indexes only users who are active.
PostgreSQL
CREATE INDEX idx_active_users ON users(last_login) WHERE active = true;
Indexes only orders placed after January 1, 2024.
PostgreSQL
CREATE INDEX idx_recent_orders ON orders(order_date) WHERE order_date > '2024-01-01';
Indexes only tasks that are pending.
PostgreSQL
CREATE INDEX idx_pending_tasks ON tasks(priority) WHERE status = 'pending';
Sample Program
This creates a table and inserts employees. Then it creates a partial index on active sales employees only. The EXPLAIN shows if the index is used for the query.
PostgreSQL
CREATE TABLE employees (
  id SERIAL PRIMARY KEY,
  name TEXT,
  department TEXT,
  active BOOLEAN
);

INSERT INTO employees (name, department, active) VALUES
('Alice', 'Sales', true),
('Bob', 'Sales', false),
('Carol', 'HR', true),
('Dave', 'HR', false);

CREATE INDEX idx_active_sales ON employees(name) WHERE department = 'Sales' AND active = true;

EXPLAIN SELECT * FROM employees WHERE department = 'Sales' AND active = true;
OutputSuccess
Important Notes
Partial indexes only help if your queries use the same condition as the WHERE clause.
They save space but add complexity to your database design.
Use EXPLAIN to check if your partial index is being used.
Summary
Partial indexes index only rows matching a condition.
They improve query speed and save space.
Use WHERE clause to define which rows to index.

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