---
title: 收集统计信息前的计划为何会不稳定？-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 收集统计信息前的计划为何会不稳定？相关的常见问题和使用技巧，帮助您快速解决 收集统计信息前的计划为何会不稳定？的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

划线反馈

# 收集统计信息前的计划为何会不稳定？

更新时间：2024-07-16 07:16

适用版本： V4.2.x 内容类型：FAQ  

## 问题解答

如果从来没有收集过统计信息，为了生成更好的计划，优化器会对表中的数据进行动态采样。

动态采样是在计划生成阶段针对数据库对象进行提前采样，通过采样的方式进行行数估计，从而用于代价模型中。

**因为动态采样过程中，每次采样的样本数据块有一定的随机性，所以即使表中的数据没有变化，动态采样的结果也可能不同，因此可能会生成不同的计划**。

## 问题举例

以下以一个没收集统计信息导致的计划不稳定的示例进行说明。

**环境信息**： 三 Zone 三副本，各个副本的 leader 打散在三个分区上。

**表定义**：一张三十个分区的分区表，上面有三个索引，一个没有分区的 global index，两个和主表一样有三十个分区的 local index 。

- 如果没有统计信息，根据不同的动态采样结果，显而易见，可能会出现两种计划。

     - 第一种情况下，走 `I_update_time` 这个 local index，好处是可以利用这个索引的有序性，优化 ORDER BY update_time DESC 排序的动作，消除各个分区内的排序（三号算子的 top n sort 不需要真正进行 sort，只需要做 top n 就够了），计划如下所示：

      ![image01](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/sql/20240710tjxx001.png)
     - 第二种情况下，走 `unique_did_uuid` 这个 global index，好处是满足 `did = ?` 这个过滤条件的数据，可以在索引上被快速定位，计划如下所示：

      ![image02](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/sql/20240710tjxx002.png)

      假设根据真实测试数据的数据特征，应该选择第二种计划。

      因为没有统计信息，所以优化器只能根据动态采样得来的部分数据，算出这两种计划的代价，然后生成代价更低的计划。即使表中的数据没有发生过变化，因为每次动态采样的数据因为有一定的随机性，会采样到不同的数据，所以可能导致生成的计划不稳定。
 - 如果采样到一批比较极端的不能代表整体数据特征的数据，就会导致生成不优的计划。例如可能会生成第一种走 `I_update_time` 这个 local index 的计划。

  ![image03](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/sql/20240710tjxx003.png)
 - 如果采样的数据比较合适，就会生成第二种走 `unique_did_uuid` 这个 global index 的计划。

  ![image04](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/sql/20240710tjxx004.png)

  #### 说明

  关于动态采样的详细介绍，参见 [优化器动态采样](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000822131)

## 适用版本

OceanBase 数据库 V4.2.x 及之后版本。

Previous

[MySQL 模式下拼接符 `||` 不识别导致计划笛卡尔积](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000988574)

Next

[SQL 在数据库中的执行时间超过 OB_QUERY_TIMEOUT 的原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210004) ![有帮助](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) 咨询热线
