Bird
Raised Fist0
PostgreSQLquery~20 mins

Sub-partitioning in PostgreSQL - Practice Problems & Coding Challenges

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
Challenge - 5 Problems
🎖️
Sub-partitioning Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
query_result
intermediate
2:00remaining
Output of Query on Sub-partitioned Table

Given a table sales sub-partitioned by region and then by month, what will be the output of this query?

SELECT region, month, SUM(amount) FROM sales GROUP BY region, month ORDER BY region, month;
PostgreSQL
CREATE TABLE sales (
  id SERIAL PRIMARY KEY,
  region TEXT,
  month INT,
  amount NUMERIC
) PARTITION BY LIST (region);

CREATE TABLE sales_east PARTITION OF sales FOR VALUES IN ('East') PARTITION BY RANGE (month);
CREATE TABLE sales_east_jan PARTITION OF sales_east FOR VALUES FROM (1) TO (2);
CREATE TABLE sales_east_feb PARTITION OF sales_east FOR VALUES FROM (2) TO (3);

INSERT INTO sales (region, month, amount) VALUES
('East', 1, 100), ('East', 1, 150), ('East', 2, 200), ('East', 2, 50);
A[{"region": "East", "month": 1, "sum": 250}, {"region": "East", "month": 2, "sum": 300}]
B[{"region": "East", "month": 1, "sum": 250}, {"region": "East", "month": 2, "sum": 250}]
C[{"region": "East", "month": 1, "sum": 250}, {"region": "East", "month": 2, "sum": 200}]
D[{"region": "East", "month": 1, "sum": 100}, {"region": "East", "month": 2, "sum": 250}]
Attempts:
2 left
💡 Hint

Remember that SUM adds all amounts for each group.

📝 Syntax
intermediate
2:00remaining
Identify the Correct Syntax for Sub-partitioning

Which of the following SQL statements correctly creates a table orders partitioned by country and sub-partitioned by order_date range in PostgreSQL?

ACREATE TABLE orders (id INT, country TEXT, order_date DATE) PARTITION BY LIST (country, order_date);
B
CREATE TABLE orders (id INT, country TEXT, order_date DATE) PARTITION BY RANGE (country);
CREATE TABLE orders_us PARTITION OF orders FOR VALUES IN ('US') PARTITION BY LIST (order_date);
C
CREATE TABLE orders (id INT, country TEXT, order_date DATE) PARTITION BY LIST (country);
CREATE TABLE orders_us PARTITION OF orders FOR VALUES IN ('US') PARTITION BY RANGE (order_date);
D
CREATE TABLE orders (id INT, country TEXT, order_date DATE) PARTITION BY RANGE (order_date);
CREATE TABLE orders_us PARTITION OF orders FOR VALUES IN ('US') PARTITION BY LIST (country);
Attempts:
2 left
💡 Hint

Sub-partitioning means partitioning a partitioned table again by another column.

optimization
advanced
2:00remaining
Optimizing Query Performance on Sub-partitioned Tables

You have a large transactions table partitioned by region and sub-partitioned by transaction_date. Which indexing strategy will most improve query performance filtering by region and transaction_date?

ACreate local indexes on <code>transaction_date</code> for each sub-partition.
BCreate a global index on <code>transaction_date</code> only.
CCreate a composite index on (<code>region</code>, <code>transaction_date</code>) on the main table.
DCreate a composite index on (<code>transaction_date</code>, <code>region</code>) on each sub-partition.
Attempts:
2 left
💡 Hint

PostgreSQL does not support global indexes on partitioned tables.

🔧 Debug
advanced
2:00remaining
Debugging Partition Constraint Violation

You created a sub-partitioned table logs partitioned by server and sub-partitioned by log_date. Inserting a row with server = 'A' and log_date = '2024-07-01' causes a constraint violation. What is the most likely cause?

PostgreSQL
CREATE TABLE logs (
  id SERIAL PRIMARY KEY,
  server TEXT,
  log_date DATE,
  message TEXT
) PARTITION BY LIST (server);

CREATE TABLE logs_a PARTITION OF logs FOR VALUES IN ('A') PARTITION BY RANGE (log_date);
CREATE TABLE logs_a_july PARTITION OF logs_a FOR VALUES FROM ('2024-06-01') TO ('2024-06-30');
AThe <code>server</code> value 'A' is not allowed in the main partition.
BThe primary key constraint is violated because <code>id</code> is duplicated.
CThe <code>message</code> column is missing a NOT NULL constraint.
DThe row's <code>log_date</code> value '2024-07-01' does not fall into any sub-partition range.
Attempts:
2 left
💡 Hint

Check the ranges defined for sub-partitions.

🧠 Conceptual
expert
2:00remaining
Understanding Sub-partitioning Benefits

Which of the following best explains the main benefit of using sub-partitioning in a large database table?

AIt allows organizing data into smaller, more manageable pieces for faster query pruning and maintenance.
BIt automatically compresses data to save disk space without user intervention.
CIt merges multiple tables into one to simplify schema design.
DIt eliminates the need for indexes by optimizing full table scans.
Attempts:
2 left
💡 Hint

Think about how partitioning helps with performance and management.

Practice

(1/5)
1. What is the main purpose of sub-partitioning in PostgreSQL?
easy
A. To encrypt data within partitions
B. To create backups of partitions automatically
C. To merge multiple partitions into one
D. To split data twice for better organization and faster queries

Solution

  1. Step 1: Understand partitioning basics

    Partitioning divides a table into parts to improve management and performance.
  2. Step 2: Recognize sub-partitioning role

    Sub-partitioning splits each partition further, organizing data more finely and speeding up queries.
  3. Final Answer:

    To split data twice for better organization and faster queries -> Option D
  4. Quick Check:

    Sub-partitioning = double data split [OK]
Hint: Sub-partitioning means splitting partitions again [OK]
Common Mistakes:
  • Thinking sub-partitioning creates backups
  • Confusing sub-partitioning with encryption
  • Believing it merges partitions
2. Which of the following is the correct syntax to create a sub-partitioned table in PostgreSQL?
easy
A. CREATE TABLE sales (id INT, region TEXT, month INT) SUBPARTITION BY RANGE (region) PARTITION BY LIST (month);
B. CREATE TABLE sales (id INT, region TEXT, month INT) PARTITION BY RANGE (region) PARTITION BY LIST (month);
C. CREATE TABLE sales (id INT, region TEXT, month INT) PARTITION BY RANGE (region) SUBPARTITION BY LIST (month);
D. CREATE TABLE sales (id INT, region TEXT, month INT) PARTITION BY LIST (region) SUBPARTITION BY HASH (month);

Solution

  1. Step 1: Identify correct keywords for partitioning

    PostgreSQL uses PARTITION BY for main partition and SUBPARTITION BY for sub-partition.
  2. Step 2: Check syntax order and clauses

    CREATE TABLE sales (id INT, region TEXT, month INT) PARTITION BY RANGE (region) SUBPARTITION BY LIST (month); correctly uses PARTITION BY RANGE then SUBPARTITION BY LIST, matching PostgreSQL syntax.
  3. Final Answer:

    CREATE TABLE sales (id INT, region TEXT, month INT) PARTITION BY RANGE (region) SUBPARTITION BY LIST (month); -> Option C
  4. Quick Check:

    Use PARTITION BY then SUBPARTITION BY [OK]
Hint: Use PARTITION BY first, then SUBPARTITION BY [OK]
Common Mistakes:
  • Using PARTITION BY twice instead of SUBPARTITION BY
  • Swapping PARTITION BY and SUBPARTITION BY keywords
  • Using SUBPARTITION BY before PARTITION BY
3. Given the following table and partitions:
CREATE TABLE orders (id INT, country TEXT, year INT) PARTITION BY LIST (country) SUBPARTITION BY RANGE (year);
CREATE TABLE orders_us PARTITION OF orders FOR VALUES IN ('US') SUBPARTITION BY RANGE (year);
CREATE TABLE orders_us_2022 PARTITION OF orders_us FOR VALUES FROM (2022) TO (2023);

What will be the result of SELECT * FROM orders WHERE country = 'US' AND year = 2022; if there are rows with country 'US' and year 2022?
medium
A. Rows with country 'US' and year 2022 will be returned
B. No rows will be returned because subpartition is missing
C. Syntax error due to incorrect partitioning
D. Rows with any country but year 2022 will be returned

Solution

  1. Step 1: Understand partition and subpartition setup

    The table is partitioned by country (LIST) and subpartitioned by year (RANGE). The 'US' partition and 2022 subpartition exist.
  2. Step 2: Query filters match partition and subpartition

    The query filters country='US' and year=2022, matching the defined partitions, so matching rows will be found.
  3. Final Answer:

    Rows with country 'US' and year 2022 will be returned -> Option A
  4. Quick Check:

    Partition + subpartition match = rows returned [OK]
Hint: Query matches partition and subpartition filters [OK]
Common Mistakes:
  • Assuming no rows because subpartition is complex
  • Thinking query causes syntax error
  • Ignoring subpartition filtering
4. You wrote this code:
CREATE TABLE logs (id INT, region TEXT, day DATE) PARTITION BY RANGE (region) SUBPARTITION BY LIST (day);

What is the error in this statement?
medium
A. RANGE partitioning cannot be done on a TEXT column
B. Partitioning by RANGE requires a numeric or date type, not TEXT
C. Syntax error: SUBPARTITION BY must come before PARTITION BY
D. SUBPARTITION BY LIST cannot be used with RANGE partitioning

Solution

  1. Step 1: Check partition column data type

    Partitioning by RANGE requires a column with an orderable type like numeric or date, not TEXT.
  2. Step 2: Identify the error cause

    Here, region is TEXT, so RANGE partitioning on it is invalid.
  3. Final Answer:

    Partitioning by RANGE requires a numeric or date type, not TEXT -> Option B
  4. Quick Check:

    RANGE needs numeric/date, not TEXT [OK]
Hint: RANGE partition needs numeric or date column [OK]
Common Mistakes:
  • Thinking TEXT can be used for RANGE partitioning
  • Confusing order of PARTITION BY and SUBPARTITION BY
  • Assuming SUBPARTITION BY LIST is invalid with RANGE
5. You want to create a sales table partitioned by region (LIST) and subpartitioned by sale_date (RANGE). Which approach correctly handles the subpartitioning to optimize query performance for recent sales?
hard
A. Partition by LIST on region, then subpartition by RANGE on sale_date with recent years as separate subpartitions
B. Partition by RANGE on sale_date, then subpartition by LIST on region with all regions in one subpartition
C. Partition by HASH on region, no subpartitioning needed for sale_date
D. Partition by LIST on sale_date, then subpartition by RANGE on region

Solution

  1. Step 1: Match partitioning to data and query needs

    Partitioning by region (LIST) groups data by location, then subpartitioning by sale_date (RANGE) organizes by time.
  2. Step 2: Optimize recent sales queries

    Using RANGE subpartitions for recent years allows fast access to recent data, improving query speed.
  3. Final Answer:

    Partition by LIST on region, then subpartition by RANGE on sale_date with recent years as separate subpartitions -> Option A
  4. Quick Check:

    LIST then RANGE for region and date [OK]
Hint: Partition by region LIST, subpartition by date RANGE [OK]
Common Mistakes:
  • Reversing partition and subpartition order
  • Using HASH partitioning without subpartitioning
  • Partitioning sale_date by LIST instead of RANGE