Bird
Raised Fist0
PostgreSQLquery~10 mins

Partial indexes with WHERE clause in PostgreSQL - Interactive Code Practice

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
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a partial index on the "users" table for active users only.

PostgreSQL
CREATE INDEX idx_active_users ON users (last_login) WHERE [1];
Drag options to blanks, or click blank then click option'
Aage > 18
Bstatus = 'active'
Clast_login IS NOT NULL
Dcountry = 'US'
Attempts:
3 left
💡 Hint
Common Mistakes
Using a condition unrelated to active users.
Omitting the WHERE clause for partial index.
2fill in blank
medium

Complete the code to create a partial index on the "orders" table for orders with status 'pending'.

PostgreSQL
CREATE INDEX idx_pending_orders ON orders (order_date) WHERE [1];
Drag options to blanks, or click blank then click option'
Astatus = 'pending'
Bstatus = 'shipped'
Camount > 100
Dcustomer_id IS NOT NULL
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'shipped' instead of 'pending' in the WHERE clause.
Indexing all orders without a WHERE clause.
3fill in blank
hard

Fix the error in the partial index creation for the "products" table to index only discontinued products.

PostgreSQL
CREATE INDEX idx_discontinued_products ON products (product_name) WHERE [1];
Drag options to blanks, or click blank then click option'
Adiscontinued = TRUE
Bdiscontinued = 'yes'
Cdiscontinued IS NULL
Ddiscontinued = FALSE
Attempts:
3 left
💡 Hint
Common Mistakes
Using string 'yes' instead of boolean TRUE.
Indexing products that are not discontinued.
4fill in blank
hard

Fill both blanks to create a partial index on the "employees" table for employees in the 'Sales' department with active status.

PostgreSQL
CREATE INDEX idx_active_sales ON employees (employee_id) WHERE [1] AND [2];
Drag options to blanks, or click blank then click option'
Adepartment = 'Sales'
Bstatus = 'active'
Cstatus = 'inactive'
Ddepartment = 'HR'
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'HR' instead of 'Sales' for department.
Using 'inactive' instead of 'active' for status.
5fill in blank
hard

Fill all three blanks to create a partial index on the "tickets" table for open tickets assigned to user 'john_doe' with priority higher than 3.

PostgreSQL
CREATE INDEX idx_open_high_priority ON tickets (ticket_id) WHERE [1] AND [2] AND [3];
Drag options to blanks, or click blank then click option'
Astatus = 'open'
Bassigned_to = 'john_doe'
Cpriority > 3
Dpriority < 3
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'closed' instead of 'open' for status.
Using priority less than 3 instead of greater than 3.
Wrong assigned user name.

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