Bird
Raised Fist0
PostgreSQLquery~20 mins

Indexing JSONB with GIN in PostgreSQL - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
JSONB GIN Index Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Query performance with GIN index on JSONB

Given a table products with a details column of type JSONB, which query will use the GIN index created as CREATE INDEX idx_gin_details ON products USING GIN (details); to efficiently find products where the color is "red"?

PostgreSQL
CREATE TABLE products (id SERIAL PRIMARY KEY, details JSONB);
CREATE INDEX idx_gin_details ON products USING GIN (details);

-- Which query uses the GIN index efficiently?
ASELECT * FROM products WHERE details @> '{"color": "red"}';
BSELECT * FROM products WHERE details->>'color' = 'red';
CSELECT * FROM products WHERE details ? 'color';
DSELECT * FROM products WHERE details->'color' = 'red';
Attempts:
2 left
💡 Hint

GIN indexes on JSONB support containment operators like @>.

🧠 Conceptual
intermediate
1:30remaining
Understanding GIN index behavior on JSONB

What does a GIN index on a JSONB column index internally to speed up queries?

AIt indexes only the top-level keys of the JSONB document.
BIt indexes only numeric values inside the JSONB document.
CIt indexes all keys and values inside the JSONB document separately.
DIt indexes the entire JSONB document as a single string.
Attempts:
2 left
💡 Hint

Think about how GIN indexes support containment queries.

📝 Syntax
advanced
1:30remaining
Correct syntax for creating a GIN index on JSONB path ops

Which of the following is the correct syntax to create a GIN index on a JSONB column data using the jsonb_path_ops operator class?

ACREATE INDEX idx_data_path ON mytable USING GIN (data jsonb_path_ops);
BCREATE INDEX idx_data_path ON mytable USING GIN (data jsonb_path_ops());
C;)spo_htap_bnosj atad( NIG GNISU elbatym NO htap_atad_xdi XEDNI ETAERC
DREATE INDEX idx_data_path ON mytable USING GIN (data jsonb_path_ops);
Attempts:
2 left
💡 Hint

Operator classes are specified without parentheses.

❓ optimization
advanced
2:00remaining
Choosing the right GIN operator class for JSONB indexing

You want to optimize queries that check if a JSONB column contains specific key-value pairs but do not need to query array elements inside JSON. Which GIN operator class should you choose?

Ajsonb_path_ops
Bjsonb_array_ops
Cjsonb_ops
Djsonb_full_ops
Attempts:
2 left
💡 Hint

One operator class is smaller and faster but supports fewer query types.

🔧 Debug
expert
2:30remaining
Diagnosing why a GIN index is not used for a JSONB query

You created a GIN index on a JSONB column info using CREATE INDEX idx_info ON users USING GIN (info);. However, the query SELECT * FROM users WHERE info->>'status' = 'active'; does not use the index and is slow. Why?

AThe index was created on the wrong column; it should be on <code>info->>'status'</code>.
BThe operator <code>->></code> does not use the GIN index; only containment operators like <code>@></code> do.
CGIN indexes do not support JSONB columns, only B-tree indexes do.
DThe query syntax is invalid and causes the planner to ignore the index.
Attempts:
2 left
💡 Hint

Consider which JSONB operators are supported by GIN indexes.

Practice

(1/5)
1. What is the main purpose of creating a GIN index on a JSONB column in PostgreSQL?
easy
A. To convert JSONB data into plain text for easier reading
B. To compress the JSONB data to save disk space
C. To automatically backup JSONB data to another table
D. To speed up queries that search for specific keys or values inside the JSONB data

Solution

  1. Step 1: Understand GIN index purpose

    GIN indexes are designed to speed up searches inside complex data types like JSONB by indexing keys and values.
  2. Step 2: Identify the benefit for JSONB queries

    Queries using operators like @> that check for existence of keys or values run faster with GIN indexes.
  3. Final Answer:

    To speed up queries that search for specific keys or values inside the JSONB data -> Option D
  4. Quick Check:

    GIN index = faster JSONB key/value search [OK]
Hint: GIN indexes speed up JSONB key/value searches [OK]
Common Mistakes:
  • Thinking GIN compresses JSONB data
  • Confusing GIN with backup or conversion tools
  • Assuming GIN indexes speed up all query types
2. Which of the following is the correct syntax to create a GIN index on a JSONB column named data in a table items?
easy
A. CREATE INDEX idx_data ON items USING GIN (data);
B. CREATE INDEX idx_data ON items USING BTREE (data);
C. CREATE INDEX idx_data ON items USING GIN (data (jsonb_path_ops));
D. CREATE INDEX idx_data ON items USING HASH (data);

Solution

  1. Step 1: Recall correct GIN index syntax

    The standard way to create a GIN index on a JSONB column is: CREATE INDEX index_name ON table_name USING GIN (column_name);
  2. Step 2: Check options for correctness

    CREATE INDEX idx_data ON items USING GIN (data); matches the correct syntax. CREATE INDEX idx_data ON items USING BTREE (data); uses BTREE which is not suitable for JSONB. CREATE INDEX idx_data ON items USING GIN (data (jsonb_path_ops)); has incorrect syntax (extra parentheses around jsonb_path_ops). CREATE INDEX idx_data ON items USING HASH (data); uses HASH which is not valid for JSONB indexing.
  3. Final Answer:

    CREATE INDEX idx_data ON items USING GIN (data); -> Option A
  4. Quick Check:

    Correct GIN index syntax = CREATE INDEX idx_data ON items USING GIN (data); [OK]
Hint: Use USING GIN with column name in parentheses [OK]
Common Mistakes:
  • Using BTREE or HASH instead of GIN
  • Incorrect syntax with extra keywords
  • Missing parentheses around column name
3. Given a table products with a JSONB column attributes and a GIN index on it, what will this query return?

SELECT * FROM products WHERE attributes @> '{"color": "red"}';
medium
A. All rows where the JSONB column contains the key "color" with value "red"
B. All rows where the JSONB column contains any key named "color"
C. All rows where the JSONB column contains the value "red" anywhere
D. Syntax error due to incorrect JSON format

Solution

  1. Step 1: Understand the @> operator

    The @> operator checks if the left JSONB contains the right JSONB as a subset, meaning the key-value pair must exist exactly.
  2. Step 2: Analyze the query condition

    The condition attributes @> '{"color": "red"}' means the JSONB column must have a key "color" with value "red".
  3. Final Answer:

    All rows where the JSONB column contains the key "color" with value "red" -> Option A
  4. Quick Check:

    @> means contains key-value pair exactly [OK]
Hint: Use @> to find exact key-value pairs in JSONB [OK]
Common Mistakes:
  • Thinking @> matches only keys, not values
  • Assuming it matches any occurrence of value
  • Confusing JSON syntax causing errors
4. You created a GIN index on a JSONB column but your queries are still slow. What is the most likely cause?
medium
A. The GIN index does not support JSONB data types
B. The index was created without specifying the JSONB column
C. The queries are not using the @> operator
D. The table has no rows

Solution

  1. Step 1: Understand when GIN index helps

    GIN indexes on JSONB columns speed up queries that use operators like @> which check for containment.
  2. Step 2: Identify why queries remain slow

    If queries do not use @> or other supported operators, the index won't be used, causing slow performance.
  3. Final Answer:

    The queries are not using the @> operator -> Option C
  4. Quick Check:

    GIN index helps only with supported operators [OK]
Hint: Use @> operator to leverage GIN index speedup [OK]
Common Mistakes:
  • Assuming GIN indexes speed up all JSONB queries
  • Not verifying query operator usage
  • Thinking GIN index doesn't support JSONB
5. You want to create a GIN index on a JSONB column info in table users to optimize queries checking for existence of specific keys only, ignoring values. Which index operator class should you use?
hard
A. jsonb_ops
B. jsonb_path_ops
C. btree_gin
D. hash_ops

Solution

  1. Step 1: Understand GIN operator classes for JSONB

    PostgreSQL provides two main operator classes for JSONB GIN indexes: jsonb_ops (default) indexes keys and values, and jsonb_path_ops indexes only keys for existence queries.
  2. Step 2: Choose operator class for key existence queries

    Since the goal is to optimize queries checking for key existence only, jsonb_path_ops is the best choice as it creates a smaller, faster index for this purpose.
  3. Final Answer:

    jsonb_path_ops -> Option B
  4. Quick Check:

    Key-only queries use jsonb_path_ops [OK]
Hint: Use jsonb_path_ops for key-existence queries [OK]
Common Mistakes:
  • Using default jsonb_ops which indexes values too
  • Choosing unrelated operator classes like btree_gin
  • Confusing hash_ops with GIN operator classes
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard