Materialized CTEs: Functions
Module: Subqueries & CTEs
**PostgreSQL Syntax:**
```sql
-- Force materialization
WITH cte_name AS MATERIALIZED (
SELECT expensive_query
)
SELECT * FROM cte_name;
-- Prevent materialization (force inlining)
WITH cte_name AS NOT MATERIALIZED (
SELECT simple_query
)
SELECT * FROM cte_name;
-- Default (PostgreSQL 12+): NOT MATERIALIZED
-- Default (PostgreSQL 11-): MATERIALIZED
```
**SQL Server (No Explicit Hint):**
```sql
-- SQL Server usually materializes automatically
WITH cte_name AS (
SELECT expensive_query
)
SELECT * FROM cte_name;
-- Check execution plan for "Table Spool" operator
```
**Checking Execution Plan:**
```sql
-- PostgreSQL
EXPLAIN ANALYZE
WITH cte AS (...)
SELECT * FROM cte;
-- Look for "CTE Scan" (materialized) vs inlined subquery
-- SQL Server
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
WITH cte AS (...)
SELECT * FROM cte;
-- Look for "Table Spool" in execution plan
```
PostgreSQL: WITH cte AS MATERIALIZED (...) forces materialization
PostgreSQL: WITH cte AS NOT MATERIALIZED (...) forces inlining