---
title: 为什么 OceanBase 数据库在进行多分区扫描时，会抛弃索引选择全表扫描-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 为什么 OceanBase 数据库在进行多分区扫描时，会抛弃索引选择全表扫描相关的常见问题和使用技巧，帮助您快速解决 为什么 OceanBase 数据库在进行多分区扫描时，会抛弃索引选择全表扫描的难题。
---
切换语言

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

划线反馈

# 为什么 OceanBase 数据库在进行多分区扫描时，会抛弃索引选择全表扫描

更新时间：2024-01-22 01:56

适用版本： V2.2.x 内容类型：TechNote  

## 问题现象

某些情况下，OceanBase 数据库在进行多分区扫描时，即使有索引并且使用索引非常快，也会抛弃索引而使用全表扫描，OceanBase 数据库的优化器评估的全表扫描的 cost 会远远低于索引扫描呢？

以下面示例进行说明。

假设有一张名为 t 的分区表，根据 a 列按天进行 24 个 range 分区。存在一个联合索引 `idx1：(b,a)`，其中 b 的选择性较好。

OceanBase 数据库在执行如下语句时，会抛弃索引 `idx1`，而使用全表扫描，从而导致执行效率地下。

```shell
select * from t where b='xxx' and a>='2022-02-27' and a<='2022-02-28'

```

## 问题原因

过滤 `a>='2022-02-27' and a<='2022-02-28'` 裁剪出了两个分区，P22、P23，其中 P23 是大分区，数据量比较多，但是满足b='xxx' 条件的数据量比较少，P22 分区满足 b='xxx' 的数据量比较多。 优化器对于分区表的行数估计策略是：选择最大的分区估算，然后乘以分区数，所以这里优化器会选择 P23 分区估行，然后乘以二，估算的行数偏小。

在行数比较少的情况下，优化器选择了主表扫描，而没有选择索引扫描。

## 解决方法

这种问题一般是 SQL 的写法有问题，可以尝试通过以下方法解决。

- 优化 SQL 写法：除了查 27 号的数据，还要查一点 28 号的数据，这种查询是不合理的，建议尝试优化 SQL 写法。
 - 使用 Hint：可以在 SQL 语句中使用 Hint 来指导优化器选择索引扫描。
 - 绑定 Outlint。

## 适用版本

OceanBase 数据库 V2.2.77 版本。

上一篇

[DML 语句调用函数报错 table is mutating](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210009)

下一篇

[修改 json 类型可能会导致 Invalid argument 问题](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000246036) ![有帮助](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) 咨询热线
