---
title: 如何人工控制 CTE 的展开与物化？-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 如何人工控制 CTE 的展开与物化？相关的常见问题和使用技巧，帮助您快速解决 如何人工控制 CTE 的展开与物化？的难题。
---
切换语言

- 简体中文
- English

划线反馈

# 如何人工控制 CTE 的展开与物化？

更新时间：2026-05-15 09:06

适用版本： V3.1.x、V3.2.x 内容类型：How-to  

SQL 中包含 CTE（common table expression）且 CTE 与其他表进行关联，优化器在选择执行计划时，会根据代价来确定是否对 CTE 进行展开或者物化。本文介绍人工控制 CTE 的展开与物化的方法。

## 适用版本

OceanBase 数据库 V3.x 版本。

## 通过 Hint 控制

CTE 的展开或物化可以由 SQL Hint 来控制。

- INLINE：展开
 - MATERIALIZE：物化

**SQL 示例**

```
WITH TMP_TB( SELECT ... FROM TB1, TB2 WHERE ....)
SELECT ... FROM TB3,TMP_TB WHERE ...
UNION ALL
SELECT ... FROM TB3,TMP_TB WHERE ...

```

**Hint 示例**

- 强制展开 CTE

  ```
  WITH TMP_TB( SELECT /*+ INLINE */... FROM TB1, TB2 WHERE ....)
  SELECT ... FROM TB3,TMP_TB WHERE ...
  UNION ALL
  SELECT ... FROM TB3,TMP_TB WHERE ...

  ```
 - 强制物化 CTE

  ```
  WITH TMP_TB( SELECT /*+ MATERIALIZE */... FROM TB1, TB2 WHERE ....)
  SELECT ... FROM TB3,TMP_TB WHERE ...
  UNION ALL
  SELECT ... FROM TB3,TMP_TB WHERE ...

  ```

## 通过配置项控制

从 V3.2 版本开始，OceanBase 数据库提供了租户级配置项来控制 CTE 的优化策略，如下表所示。

| 配置项 | 取值说明 |
| --- | --- |
| `_with_subquery` | - 0: OPTIMIZE，由优化器决策CTE是否物化执行还是展开执行 - 1: MATERIALIZE，强制优化器物化 - CTE2: INLINE，强制优化器展开CTE |

默认的优化策略为 `_with_subquery=0`，即优化器自行决定是否需要物化或者展开 CTE。

`_with_subquery` 是租户级配置项，如果在 SYS 租户中设置租户级配置项，需要指定 TENANT。

示例如下：

```
alter system set _with_subquery=1 tenant ob_mysql;

```

Previous

[SQL 中表含 enum 列导致 LEFT JOIN 未 rewrite 为 JOIN](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000706751)

Next

[如何快速获得表中某列的 NDV 值](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000217879) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
