基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
分区表使用建议
更新时间:2023-07-18 17:25:59
通常当表的数据量非常大,以致于可能使数据库空间紧张,或者由于表非常大导致相关 SQL 查询性能变慢时,可以考虑使用分区表。
唯一索引和拆分键
使用分区表时要选择合适的拆分键以及拆分策略。如果是日志类型的大表,根据时间类型的列做 RANGE 分区是最合适的。如果是并发访问非常高的表,结合业务特点选择能满足绝大部分核心业务查询的列作为拆分键是最合适的。无论选哪个列做为分区键,都不大可能满足所有的查询性能。
分区表中的全局唯一性需求可以通过主键约束和唯一约束实现。OceanBase 数据库的分区表的主键约束和唯一键约束必须包含拆分键。唯一约束也是一个全局索引。全局唯一的需求也可以通过本地唯一索引实现,只需要在唯一索引里包含拆分键。
示例
创建有唯一性约束的分区表
创建
account表。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;创建索引
account_uk。obclient> CREATE UNIQUE INDEX account_uk ON account(name, id) LOCAL ; Query OK, 0 rows affected查看分区表中的约束与索引信息。
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查看
account表中的索引和约束信息。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 操作会导致分区移动,则会禁止这种更新。
示例
创建
t_prat表。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;将
t_part表插入数据。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查看
t_part表数据。obclient> select * from t_part; +----+----+-----------+ | ID | C1 | C2 | +----+----+-----------+ | 4 | D | dddddddd | | 3 | C | ccccccccc | | 2 | B | bbbbbbbbb | | 1 | A | aaaaaaaa | +----+----+-----------+ 4 rows in set更新分区键
c1。obclient> update t_part set c1='CC' where c1='C'; ORA-14402: updating partition key column would cause a partition change
如果分区键的值没有变化,建议不要更新它。如果分区键的值有变化,则需要开启表的如下属性:
示例
打开行移动功能。
obclient> alter table t_part enable row movement; Query OK, 0 rows affected再次更新分区键
c1。obclient> update t_part set c1='CC' where c1='C'; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0