Bird
Raised Fist0
PostgreSQLquery~5 mins

Expression indexes in PostgreSQL - Cheat Sheet & Quick Revision

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
Recall & Review
beginner
What is an expression index in PostgreSQL?
An expression index is an index built on the result of an expression or function applied to one or more columns, not just on the raw column values.
Click to reveal answer
beginner
Why use an expression index instead of a regular index?
Expression indexes speed up queries that filter or sort based on computed values, like lowercased text or date parts, which regular indexes on raw columns cannot optimize.
Click to reveal answer
intermediate
How do you create an expression index on the lower case of a column named 'name'?
Use: CREATE INDEX idx_lower_name ON table_name (LOWER(name)); This creates an index on the lowercased values of 'name'.
Click to reveal answer
intermediate
Can expression indexes be used with WHERE clauses?
Yes, you can create partial expression indexes by adding a WHERE clause to index only rows meeting certain conditions, improving performance and saving space.
Click to reveal answer
advanced
What happens if you query without using the exact expression in the WHERE clause that matches the expression index?
PostgreSQL cannot use the expression index if the query's expression does not exactly match the index expression, so the index won't speed up that query.
Click to reveal answer
What does an expression index in PostgreSQL index?
AOnly the raw column values
BThe result of a function or expression applied to columns
COnly primary key columns
DOnly text columns
Which SQL command creates an expression index on the lower case of column 'email'?
ACREATE INDEX idx_email_lower ON users (LOWER);
BCREATE INDEX idx_email_lower ON users (email);
CCREATE INDEX idx_email_lower ON users (LOWER(email));
DCREATE INDEX idx_email_lower ON users (LOWER(email)) WHERE email IS NOT NULL;
Can expression indexes improve performance for queries filtering by a computed value?
AOnly for sorting, not filtering
BNo, they only work on raw columns
COnly if the table is small
DYes, they speed up queries using that computed value
What is a partial expression index?
AAn index on an expression with a WHERE clause limiting rows indexed
BAn index on only part of a column's text
CAn index that covers only primary keys
DAn index that is created automatically by PostgreSQL
If a query uses a different expression than the one in the expression index, what happens?
AThe index is not used for that query
BThe index is used anyway
CPostgreSQL automatically adjusts the index
DThe query fails
Explain what an expression index is and give a simple example of when you would use one.
Think about indexing computed values instead of raw columns.
You got /3 concepts.
    Describe how partial expression indexes work and why they might be useful.
    Consider indexing only some rows based on a condition.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of an expression index in PostgreSQL?
      easy
      A. To create a backup of the database
      B. To store data in a compressed format
      C. To speed up queries that filter or sort by a calculated expression
      D. To enforce foreign key constraints

      Solution

      1. Step 1: Understand what expression indexes do

        Expression indexes are special indexes built on the result of an expression or function, not just a column.
      2. Step 2: Identify their main use

        They help speed up queries that filter or sort using that expression, improving performance.
      3. Final Answer:

        To speed up queries that filter or sort by a calculated expression -> Option C
      4. Quick Check:

        Expression index purpose = speed up expression queries [OK]
      Hint: Expression indexes speed up queries using expressions [OK]
      Common Mistakes:
      • Confusing expression indexes with data compression
      • Thinking expression indexes create backups
      • Mixing expression indexes with constraints
      2. Which of the following is the correct syntax to create an expression index on the lowercased username column in PostgreSQL?
      easy
      A. CREATE INDEX idx_lower_username ON users (LOWER(username));
      B. CREATE INDEX idx_lower_username ON users ((LOWER(username)));
      C. CREATE INDEX idx_lower_username ON users [LOWER(username)];
      D. CREATE INDEX idx_lower_username ON users {LOWER(username)};

      Solution

      1. Step 1: Recall expression index syntax

        Expression indexes require double parentheses around the expression inside the index definition.
      2. Step 2: Check each option

        CREATE INDEX idx_lower_username ON users ((LOWER(username))); uses double parentheses correctly: ((LOWER(username))). Options B, C, and D use incorrect syntax.
      3. Final Answer:

        CREATE INDEX idx_lower_username ON users ((LOWER(username))); -> Option B
      4. Quick Check:

        Expression index syntax = double parentheses [OK]
      Hint: Use double parentheses for expressions in CREATE INDEX [OK]
      Common Mistakes:
      • Using single parentheses instead of double
      • Using square or curly brackets
      • Missing parentheses around the expression
      3. Given the table products(id INT, price NUMERIC) and the index:
      CREATE INDEX idx_discounted_price ON products ((price * 0.9));
      What will the query below use to speed up filtering?
      SELECT * FROM products WHERE price * 0.9 < 100;
      medium
      A. It will perform a full table scan ignoring the index
      B. It will use a default index on price if it exists
      C. It will cause a syntax error due to the expression
      D. It will use the expression index on (price * 0.9) to speed up the query

      Solution

      1. Step 1: Understand the expression index usage

        The index is created on the expression (price * 0.9), matching the WHERE clause expression exactly.
      2. Step 2: Match query filter with index expression

        Since the query filters on price * 0.9 < 100, PostgreSQL can use the expression index to speed up filtering.
      3. Final Answer:

        It will use the expression index on (price * 0.9) to speed up the query -> Option D
      4. Quick Check:

        Matching expression in WHERE = index used [OK]
      Hint: Expression index used if query expression matches exactly [OK]
      Common Mistakes:
      • Assuming default indexes are used instead
      • Thinking expression indexes cause errors
      • Believing full table scan always happens
      4. You tried to create an expression index with:
      CREATE INDEX idx_expr ON sales (price * discount);
      But PostgreSQL returned a syntax error. What is the problem?
      medium
      A. Expression indexes require double parentheses around the expression
      B. You cannot create indexes on expressions involving multiplication
      C. The table name is missing
      D. The index name is invalid

      Solution

      1. Step 1: Check expression index syntax

        Expression indexes must have the expression enclosed in double parentheses to be valid.
      2. Step 2: Identify the syntax error cause

        The given statement uses single parentheses, causing a syntax error.
      3. Final Answer:

        Expression indexes require double parentheses around the expression -> Option A
      4. Quick Check:

        Double parentheses fix syntax error [OK]
      Hint: Use double parentheses for expressions to avoid syntax errors [OK]
      Common Mistakes:
      • Using single parentheses for expressions
      • Thinking multiplication is not allowed
      • Ignoring syntax error details
      5. You want to speed up queries filtering by the first 3 letters of a city column in a locations table. Which expression index will best help?
      CREATE INDEX idx_city_prefix ON locations (???);
      hard
      A. LEFT(city, 3)
      B. SUBSTRING(city FROM 1 FOR 3)
      C. city[1:3]
      D. city LIKE '___%'

      Solution

      1. Step 1: Identify correct expression syntax for substring

        PostgreSQL supports the function LEFT(string, n) to get the first n characters.
      2. Step 2: Evaluate options for expression index

        LEFT(city, 3) uses LEFT(city, 3) correctly inside the index. SUBSTRING(city FROM 1 FOR 3) uses SUBSTRING but syntax is less common and may be less efficient. city[1:3] is invalid syntax. city LIKE '___%' is a condition, not an expression.
      3. Final Answer:

        LEFT(city, 3) -> Option A
      4. Quick Check:

        LEFT function best for prefix expression index [OK]
      Hint: Use LEFT(column, n) for prefix expression indexes [OK]
      Common Mistakes:
      • Using invalid substring syntax
      • Confusing LIKE pattern with expression
      • Using array slice syntax on strings