---
title: "分区表使用建议 | OceanBase 文档中心"
description: 分区表使用建议 通常当表的数据量非常大，以致于可能使数据库空间紧张，或者由于表非常大导致相关 SQL 查询性能变慢时，可以考虑使用分区表。 唯一索引和拆分键 使用分区表时要选择合适的拆分键以及拆分策略。如果是日志类型的大表，根据时间类型的列做 RANGE 分区是最合适的。如果是并发访问非常高的表，结合业务特点选择能满…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 分区表使用建议

更新时间：2023-07-18 17:25:59

通常当表的数据量非常大，以致于可能使数据库空间紧张，或者由于表非常大导致相关 SQL 查询性能变慢时，可以考虑使用分区表。

## 唯一索引和拆分键

使用分区表时要选择合适的拆分键以及拆分策略。如果是日志类型的大表，根据时间类型的列做 RANGE 分区是最合适的。如果是并发访问非常高的表，结合业务特点选择能满足绝大部分核心业务查询的列作为拆分键是最合适的。无论选哪个列做为分区键，都不大可能满足所有的查询性能。

分区表中的全局唯一性需求可以通过主键约束和唯一约束实现。OceanBase 数据库的分区表的主键约束和唯一键约束必须包含拆分键。唯一约束也是一个全局索引。全局唯一的需求也可以通过本地唯一索引实现，只需要在唯一索引里包含拆分键。

### 示例

创建有唯一性约束的分区表

1. 创建 `account` 表。

   ```sql
   CREATE TABLE account(
       id NUMBER NOT NULL PRIMARY KEY
       , name VARCHAR2(50) NOT NULL UNIQUE
       , value NUMBER NOT NULL
       , gmt_create DATE DEFAULT SYSDATE NOT NULL
       , gmt_modified DATE DEFAULT SYSDATE NOT NULL  
   ) PARTITION BY HASH(ID) PARTITIONS 16;

   ```
 2. 创建索引 `account_uk` 。

   ```sql
   obclient> CREATE UNIQUE INDEX account_uk ON account(name, id) LOCAL ;
   Query OK, 0 rows affected

   ```
 3. 查看分区表中的约束与索引信息。

   ```sql
   obclient> SELECT table_Name,index_name,uniqueness,partitioned FROM user_Indexes WHERE table_name= 'ACCOUNT';
   +------------+-----------------------------------+------------+-------------+
   | TABLE_NAME | INDEX_NAME                        | UNIQUENESS | PARTITIONED |
   +------------+-----------------------------------+------------+-------------+
   | ACCOUNT    | ACCOUNT_OBPK_1650952912935194     | UNIQUE     | YES         |
   | ACCOUNT    | ACCOUNT_OBUNIQUE_1650952912936028 | UNIQUE     | NO          |
   | ACCOUNT    | ACCOUNT_UK                        | UNIQUE     | YES         |
   +------------+-----------------------------------+------------+-------------+
   3 rows in set

   ```
 4. 查看 `account` 表中的索引和约束信息。

   ```unknow
   obclient> SELECT table_name, constraint_name, constraint_type, status, index_name FROM user_constraints t WHERE table_name= 'ACCOUNT'\G
   *************************** 1. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBUNIQUE_1650952912936028
   CONSTRAINT_TYPE: U
            STATUS: ENABLED
        INDEX_NAME: ACCOUNT_OBUNIQUE_1650952912936028
   *************************** 2. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_UK
   CONSTRAINT_TYPE: U
            STATUS: ENABLED
        INDEX_NAME: ACCOUNT_UK
   *************************** 3. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBNOTNULL_1650952912935181
   CONSTRAINT_TYPE: C
            STATUS: ENABLED
        INDEX_NAME: NULL
   *************************** 4. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBPK_1650952912935194
   CONSTRAINT_TYPE: P
            STATUS: ENABLED
        INDEX_NAME: ACCOUNT_OBPK_1650952912935194
   *************************** 5. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBNOTNULL_1650952912935211
   CONSTRAINT_TYPE: C
            STATUS: ENABLED
        INDEX_NAME: NULL
   *************************** 6. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBNOTNULL_1650952912935219
   CONSTRAINT_TYPE: C
            STATUS: ENABLED
        INDEX_NAME: NULL
   *************************** 7. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBNOTNULL_1650952912935225
   CONSTRAINT_TYPE: C
            STATUS: ENABLED
        INDEX_NAME: NULL
   *************************** 8. row ***************************
        TABLE_NAME: ACCOUNT
   CONSTRAINT_NAME: ACCOUNT_OBNOTNULL_1650952912935421
   CONSTRAINT_TYPE: C
            STATUS: ENABLED
        INDEX_NAME: NULL
   8 rows in set

   ```

## 更新分区键

在针对分区表做 UPDATE 时，如果更新了分区键，理论上记录有可能需要从一个分区移动到另外一个分区。如果系统检测到 UPDATE 操作会导致分区移动，则会禁止这种更新。

### 示例

1. 创建 `t_prat` 表。

   ```unknow
   create table t_part(
     id number not null,
     c1 varchar2(10) not null,
     c2 varchar2(100),
     primary key(id, c1)
   ) partition by hash(c1) partitions 8;

   ```
 2. 将 `t_part` 表插入数据。

   ```unknow
   obclient> insert into t_part(id,c1,c2) values(1,'A','aaaaaaaa'),(2,'B','bbbbbbbbb'),(3,'C','ccccccccc'),(4,'D','dddddddd');
   Query OK, 4 rows affected
   Records: 4  Duplicates: 0  Warnings: 0

   ```
 3. 查看 `t_part` 表数据。

   ```unknow
   obclient> select * from t_part;
   +----+----+-----------+
   | ID | C1 | C2        |
   +----+----+-----------+
   |  4 | D  | dddddddd  |
   |  3 | C  | ccccccccc |
   |  2 | B  | bbbbbbbbb |
   |  1 | A  | aaaaaaaa  |
   +----+----+-----------+
   4 rows in set

   ```
 4. 更新分区键 `c1`。

   ```unknow
   obclient> update t_part set c1='CC' where c1='C';
   ORA-14402: updating partition key column would cause a partition change

   ```

如果分区键的值没有变化，建议不要更新它。如果分区键的值有变化，则需要开启表的如下属性：

### 示例

1. 打开行移动功能。

   ```unknow
   obclient>  alter table t_part enable row movement;
   Query OK, 0 rows affected

   ```
 2. 再次更新分区键 `c1`。

   ```unknow
   obclient> update t_part set c1='CC' where c1='C';
   Query OK, 1 row affected
   Rows matched: 1  Changed: 1  Warnings: 0

   ```

 上一篇 下一篇 ![有帮助](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) 咨询热线
