SQL Practice Logo

SQLPractice Online

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