---
title: Oceanbase 数据库 V4.x 版本，对于无主键表分区键默认不参与抽取 Query Range-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 Oceanbase 数据库 V4.x 版本，对于无主键表分区键默认不参与抽取 Query Range相关的常见问题和使用技巧，帮助您快速解决 Oceanbase 数据库 V4.x 版本，对于无主键表分区键默认不参与抽取 Query Range的难题。
---
切换语言

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

划线反馈

# Oceanbase 数据库 V4.x 版本，对于无主键表分区键默认不参与抽取 Query Range

更新时间：2026-05-14 07:41

适用版本： V4.0.x、V4.1.x、V4.2.x、V4.3.x 内容类型：TechNote  

在 OceanBase 数据库之前版本中，为了更好兼容 Oracle 堆表的行为，有实现过无主键表，在无主键表内部使用**分区键+全局自增列**作为隐藏主键，这个做法带来了许多问题：

1. 受制于分区键的长度，RowID 的长度是变长的，Oracle 的 RowID 长度为 10 字节，在很多外部业务应用中，RowID 长度是写死在应用程序中的，很难修改，这导致 OceanBase 的推广遇到了很多问题。
 2. 无法进行无主键分区表和无主键非分区表的分区交换，功能上与 Oracle 不兼容。
 3. 全局自增列引入了额外的依赖，性能上存在瓶颈，同时也很难做表级备份恢复等操作。 因此在 OceanBase 数据库 V4.0 版本中，重新设计了 OceanBase 数据库的无主键表行为，使用分区内自增列作为隐藏主键，可以取得和 Oracle 行为完全一致的兼容性。 上述改变带来的另外一个变化是对于无主键的分区表，在 OceanBase 数据库 V3.x 版本中分区键是可以参与抽取 Query Range 的，但是在 V4.x 中，分区键不再参与抽取 Query Range。

## 详细说明

具体示例如下。

- 在 OceanBase 数据库 V3.x 版本下创建无主键分区表。

  ```shell
  CREATE TABLE T (
  "DATA_DATE" DATE NOT NULL ENABLE,
  "BIZ_ID" VARCHAR2(300) NOT NULL ENABLE,
  "SUBJ_CODE" VARCHAR2(50),
  "OPEN_ORG_NO" VARCHAR2(50),
  CONSTRAINT "IND_T_1" UNIQUE ("DATA_DATE", "BIZ_ID") USING INDEX LOCAL
  ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
  partition by list("DATA_DATE")
  (
  partition "D20240430" values  (TO_DATE(' 2024-04-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
  partition "D20240531" values  (TO_DATE(' 2024-05-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
  partition "D20240630" values  (TO_DATE(' 2024-06-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
  partition "D20240730" values  (TO_DATE(' 2024-07-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')));

  CREATE TABLE "T1" (
  "BIZ_ID" VARCHAR2(300) NOT NULL ENABLE,
  "BIZ_TYPE" VARCHAR2(10) NOT NULL ENABLE,
  "DATA_DATE" DATE NOT NULL ENABLE
  ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
  partition by list("DATA_DATE")
  (partition "D20240430" values  (TO_DATE(' 2024-04-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
  partition "D20240531" values  (TO_DATE(' 2024-05-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
  partition "D20240630" values  (TO_DATE(' 2024-06-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
  partition "D20240730" values  (TO_DATE(' 2024-07-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')));

  ```

  计划中可以看到分区键 DATA_DATE 被加入，同掩藏主键一起参与抽取 Query Range。这样做的好处是减少了基表扫描的数据。

  ![image01](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250704escape-character-like-clause-sql-statement-failure-hit-plan-cache01.png)
 - 在 OceanBase 数据库 V4.x 版本下创建同样的无主键分区表，但是在 V4.x 版本的计划中，分区键并没有参与抽取 Query Range，只是作为基表扫描后的过滤条件使用。

  ![image02](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250704escape-character-like-clause-sql-statement-failure-hit-plan-cache02.png)

  对于此类问题，可以通过在查询语句中指定分区的方式，缩小分区范围。 也可以在**分区键+其他唯一且不为空的字段一起创建唯一索引**达到分区剪裁的目的（如果没有唯一不为空的字段，可以添加自增列）。

  此外，在此问题中，T 表存在唯一约束 uk ("DATA_DATE", "BIZ_ID") , 但是不能当作唯一主键使用。
 - 主键和唯一约束（唯一索引）的区别。

  主键是 not null+ 唯一。 唯一约束（唯一索引）是强调唯一，但是可以为 null。

  在上面的例子中，在 `DATA_DATE,BIZ_TYPE` 字段创建 PK 之后，分区键可以参与抽取 Query Range。

  ![image03](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/knowledge-base/database/performance/20250604ob4x-tables-without-primary-keys-partition-keys-not-included-query-range-extraction-default03.png)

## 适用版本

OceanBase 数据库 V4.x 版本。

上一篇

[sql audit 内存满之后不刷新](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000004121103)

下一篇

[子查询过滤条件为分区键 SQL 报错 -4016 can not find part expr 的原因和解决方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003701992) ![有帮助](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) 咨询热线
