---
title: 升级 OBServer 版本后 SQL 计划无法 OR 展开执行变慢的原因和解决方法-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 升级 OBServer 版本后 SQL 计划无法 OR 展开执行变慢的原因和解决方法相关的常见问题和使用技巧，帮助您快速解决 升级 OBServer 版本后 SQL 计划无法 OR 展开执行变慢的原因和解决方法的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 升级 OBServer 版本后 SQL 计划无法 OR 展开执行变慢的原因和解决方法

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

适用版本： V2.1.x、V2.2.x、V3.1.x、V3.2.x、V4.0.x、V4.1.x、V4.2.x 内容类型：Troubleshoot  

## 问题现象

业务集群从 OceanBase 数据库 V4.2.5 BP2 Hotfix3 版本升级到 V4.2.5 BP3 Hotfix3 版本后，执行计划发生了改变，升级前 SQL 中的谓词 `OR` 能正常转成 `UNION ALL`，升级后新版本无法 OR 展开转成 `UNION ALL` 的计划。 升级前老版本 V4.2.5 BP2 Hotfix3 执行 5ms，升级后执行几个小时也无法完成，且手动指定 `/*+ USE_CONCAT */` Hint 也执行不出来，业务 SQL 中使用了视图、复制表、`UDF`。

```shell
SELECT  'Y' FROM xxx A, xxx B  WHERE A.xxxNO = B.xxxNO  AND (A.APPxxx = 'xxx'  OR B.INxxx = 'xxx'  OR B.JxxxNO = 'xxx' ) AND ROWNUM = 1;

```

升级前的计划：

![image01](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250609after-upgrading-obv-sql-plan-cannot-be-or-expanded-execution-becomes-slow01.png)

升级后的计划：

![image02](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250609after-upgrading-obv-sql-plan-cannot-be-or-expanded-execution-becomes-slow02.png)

## 关键诊断信息

### 触发条件

SQL 中有 `OR` 的谓词条件并且使用了自定义函数 UDF 没有显式指定 `DETERMINISTIC`。

### 事前巡检

1. 如果计划能 `OR` 展开侧计划 Outline Data 信息会包含 `/*+ USE_CONCAT */` Hint，如果没有 `/*+ USE_CONCAT */` Hint 同时有 `UNION ALL` 算子计划可能没展开。

   ![image03](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250609after-upgrading-obv-sql-plan-cannot-be-or-expanded-execution-becomes-slow03.png)
 2. 检查计划中 Filter 使用使用了自定义函数是否定义显式指定 `DETERMINISTIC` 或者使用了不确定性的函数。

   ![image04](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250609after-upgrading-obv-sql-plan-cannot-be-or-expanded-execution-becomes-slow04.png)

## 问题原因

OceanBase 数据库 V4.2.5 BP3 之前的版本，如果用户 SQL 使用了自定义函数 UDF，不会进行确定性检查，`OR` 展开之后会得到一个潜在更好的计划，但遇到边界条件的场景，`UDF` 行为不具备确定性的话，结果就会错，所以 V4.2.5 BP3 增加了 `UDF` 的确定性检查，只有标记了确定性的 `UDF`，才可以尝试 `OR` 展开。这个业务是创建了一个 `UDF`，这个 `UDF` 实际行为是确定性的，但没有带 `DETERMINISTIC` 的标记，必须显式指定 `DETERMINISTIC`，`UDF` 有标记后，然后优化器就可以认为这个 `UDF` 就是一个是确定的 const expr 对其做 `OR` 展开或者其他优化。

**补充说明:**

如果一个自定义函数 `UDF` 总是对相同的输入参数产生相同的结果，那么它被认为是**确定性的**，否则就被认为是**不确定性的**。如果 `UDF` 定义中既没有给出 `DETERMINISTIC` 也没有给出 `NOT DETERMINISTIC`，则默认为 `NOT DETERMINISTIC`。要声明函数是确定性的，必须显式指定 `DETERMINISTIC`。

```shell
-- 如何定义一个 DETERMINISTIC 函数
DELIMITER //
CREATE FUNCTION add_numbers(a INT, b INT)
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE result INT;
    SET result = a + b;
    RETURN result;
END //
DELIMITER;

-- 非 DETERMINISTIC 函数的示例
DELIMITER //
CREATE FUNCTION get_current_time()
RETURNS TIME
NOT DETERMINISTIC
BEGIN
    DECLARE current_time TIME;
    SET current_time = CURTIME();
    RETURN current_time;
END //
DELIMITER;

```

## 问题的风险及影响

OceanBase 数据库 V4.2.5 BP3 版本增加了 `UDF` 的确定性检查会导致没显式指定 `DETERMINISTIC` 的 `UDF` 无法 `OR` 展开，计划等同于全表扫描执行慢。

## 适用版本

OceanBase 数据库 V4.2.5 BP3（oceanbase-4.2.5.3-103000142025033110）之前的版本。

## 解决方法与规避方式

SQL 中有 `OR` 的谓词条件并且使用了自定义函数 `UDF` 必要显式指定 `DETERMINISTIC`，业务也需要规避使用不确定性的 `UDF` 函数。

上一篇

[常量字符串前声明了 binary 后，会在列上加 cast，导致无法抽取 query range](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003250379)

下一篇

[DBA_SCHEDULER_WINDOWS 视图的 NEXT_RUN_DATE 不符合预期](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000743666) ![有帮助](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) 咨询热线
