A materialized view is a database object that stores the result of a query physically. It allows faster access to the data because the query is precomputed and saved.
Click to reveal answer
beginner
How do you create a materialized view in PostgreSQL?
Use the syntax: CREATE MATERIALIZED VIEW view_name AS SELECT ...; This creates a stored result of the SELECT query.
Click to reveal answer
intermediate
What is the difference between a materialized view and a regular view?
A regular view runs the query every time you access it, showing fresh data. A materialized view stores the query result physically and needs to be refreshed to update data.
Click to reveal answer
beginner
How do you refresh a materialized view in PostgreSQL?
Use the command: REFRESH MATERIALIZED VIEW view_name; This updates the stored data with the latest query results.
Click to reveal answer
intermediate
Can you create indexes on a materialized view?
Yes, you can create indexes on a materialized view to speed up queries on it, just like on regular tables.
Click to reveal answer
What does the CREATE MATERIALIZED VIEW command do?
AStores the result of a query physically for faster access
BCreates a temporary table
CRuns a query every time you access it
DDeletes data from a table
✗ Incorrect
A materialized view stores the query result physically, unlike a regular view which runs the query each time.
How do you update the data inside a materialized view?
ABy running REFRESH MATERIALIZED VIEW
BBy running UPDATE on the materialized view
CIt updates automatically
DBy dropping and recreating the view
✗ Incorrect
You must explicitly refresh a materialized view to update its data.
Which of the following is true about materialized views?
AThey always show real-time data
BThey cannot have indexes
CThey store data physically on disk
DThey are the same as temporary tables
✗ Incorrect
Materialized views store data physically, unlike regular views.
What is the main benefit of using a materialized view?
AAutomatic data updates
BFaster query performance by avoiding repeated computation
CLess disk space usage
DSimpler syntax than views
✗ Incorrect
Materialized views improve performance by storing query results.
Which command creates a materialized view named 'sales_summary'?
AREFRESH MATERIALIZED VIEW sales_summary;
BCREATE VIEW sales_summary AS SELECT * FROM sales;
CCREATE TABLE sales_summary AS SELECT * FROM sales;
DCREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales;
✗ Incorrect
The CREATE MATERIALIZED VIEW command creates the materialized view with the query result.
Explain what a materialized view is and how it differs from a regular view.
Think about how data is stored and updated.
You got /4 concepts.
Describe the steps to create and refresh a materialized view in PostgreSQL.
Focus on commands and their purpose.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of a CREATE MATERIALIZED VIEW in PostgreSQL?
easy
A. To create a temporary table that disappears after the session
B. To create an index on a table column
C. To define a virtual table that always runs the query on access
D. To store the result of a query physically for faster access
Solution
Step 1: Understand what a materialized view does
A materialized view stores the result of a query physically, unlike a normal view which runs the query every time.
Step 2: Compare options with this definition
To store the result of a query physically for faster access matches this behavior exactly. Options A and C describe temporary tables and normal views, not materialized views. To create an index on a table column is unrelated.
Final Answer:
To store the result of a query physically for faster access -> Option D
Quick Check:
Materialized view = stored query result [OK]
Hint: Materialized views save query results physically for speed [OK]
Common Mistakes:
Confusing materialized views with normal views
Thinking materialized views are temporary tables
Assuming materialized views auto-update without refresh
2. Which of the following is the correct syntax to create a materialized view named sales_summary from a table sales?
easy
A. CREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales;
B. CREATE VIEW MATERIALIZED sales_summary AS SELECT * FROM sales;
C. CREATE MATERIALIZED VIEW sales_summary SELECT * FROM sales;
D. CREATE MATERIALIZED VIEW sales_summary FROM sales;
Solution
Step 1: Recall the correct syntax for creating materialized views
The correct syntax is: CREATE MATERIALIZED VIEW view_name AS SELECT ...
Step 2: Check each option against this syntax
CREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales; matches exactly. CREATE VIEW MATERIALIZED sales_summary AS SELECT * FROM sales; swaps keywords incorrectly. CREATE MATERIALIZED VIEW sales_summary SELECT * FROM sales; misses the AS keyword. CREATE MATERIALIZED VIEW sales_summary FROM sales; uses FROM instead of AS and SELECT.
Final Answer:
CREATE MATERIALIZED VIEW sales_summary AS SELECT * FROM sales; -> Option A
Quick Check:
Syntax = CREATE MATERIALIZED VIEW ... AS SELECT ... [OK]
Hint: Use 'AS SELECT' after materialized view name [OK]
Common Mistakes:
Omitting the AS keyword
Swapping VIEW and MATERIALIZED keywords
Using FROM instead of AS SELECT
3. Given the following commands:
CREATE TABLE products (id INT, price INT);
INSERT INTO products VALUES (1, 100), (2, 200);
CREATE MATERIALIZED VIEW cheap_products AS SELECT * FROM products WHERE price < 150;
SELECT * FROM cheap_products;
What will be the output of the SELECT query?
medium
A. Rows with id=1 and price=100
B. Rows with id=2 and price=200
C. No rows returned
D. Syntax error
Solution
Step 1: Understand the data and materialized view filter
The table has two rows: (1,100) and (2,200). The materialized view selects rows where price < 150, so only (1,100) qualifies.
Step 2: Query the materialized view
Since the materialized view stores the filtered rows, selecting from it returns the row with id=1 and price=100.
Final Answer:
Rows with id=1 and price=100 -> Option A
Quick Check:
Filter price < 150 = row with id=1 [OK]
Hint: Materialized view stores filtered rows, returns matching data [OK]
Common Mistakes:
Expecting all rows instead of filtered ones
Confusing materialized view with normal view behavior
Assuming syntax error due to multiple commands
4. Consider this SQL:
CREATE MATERIALIZED VIEW recent_orders AS SELECT * FROM orders WHERE order_date > CURRENT_DATE - INTERVAL '7 days';
REFRESH MATERIALIZED VIEW recent_orders;
Which of the following is a common mistake that would cause an error or unexpected behavior?
medium
A. Using REFRESH MATERIALIZED VIEW without CONCURRENTLY
B. Creating the materialized view without a SELECT statement
C. Not refreshing the materialized view after data changes
D. Using CURRENT_DATE in the WHERE clause
Solution
Step 1: Analyze each option for errors
Not refreshing the materialized view after data changes causes stale data but no error. Using REFRESH MATERIALIZED VIEW without CONCURRENTLY is allowed but locks the view during refresh. Creating the materialized view without a SELECT statement is invalid syntax because materialized views require a SELECT query. Using CURRENT_DATE in the WHERE clause is valid usage.
Step 2: Identify the syntax error
Creating a materialized view without a SELECT statement causes a syntax error, so Creating the materialized view without a SELECT statement is the mistake causing error.
Final Answer:
Creating the materialized view without a SELECT statement -> Option B
Quick Check:
Materialized view requires SELECT query [OK]
Hint: Materialized views must have a SELECT query [OK]
Common Mistakes:
Skipping the SELECT query in CREATE MATERIALIZED VIEW
Ignoring need to refresh after data changes
Assuming REFRESH must use CONCURRENTLY always
5. You have a large table sales_data that updates daily. You want to create a materialized view monthly_summary that shows total sales per month. Which approach correctly creates and maintains this materialized view efficiently?
hard
A. CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW monthly_summary;
B. CREATE VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1;
C. CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_summary;
D. CREATE MATERIALIZED VIEW monthly_summary AS SELECT * FROM sales_data; REFRESH MATERIALIZED VIEW monthly_summary;
Solution
Step 1: Understand the goal and data size
We want a summary per month from a large table that updates daily. Using a materialized view with aggregation is good for performance.
Step 2: Choose the best refresh method
CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW monthly_summary; refreshes but locks the view, blocking reads. CREATE MATERIALIZED VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_summary; uses REFRESH MATERIALIZED VIEW CONCURRENTLY, allowing reads during refresh, which is efficient for large data. CREATE VIEW monthly_summary AS SELECT date_trunc('month', sale_date) AS month, SUM(amount) FROM sales_data GROUP BY 1; is a normal view, recalculating every time, slow for large data. CREATE MATERIALIZED VIEW monthly_summary AS SELECT * FROM sales_data; REFRESH MATERIALIZED VIEW monthly_summary; stores all raw data, not aggregated, so not efficient.
Final Answer:
CREATE MATERIALIZED VIEW with aggregation and REFRESH MATERIALIZED VIEW CONCURRENTLY -> Option C
Quick Check:
Use CONCURRENTLY to refresh without blocking [OK]
Hint: Use CONCURRENTLY to refresh materialized views without locking [OK]
Common Mistakes:
Using normal views for large aggregated data
Refreshing materialized views without CONCURRENTLY causing locks
Creating materialized views without aggregation for summaries
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.