首页 > 解决方案 > 整数列上的 Oracle 自动分区策略

问题描述

我需要一些关于如何在整数列上执行自动分区的帮助,类似于我们对日期列(如PARTITION BY RANGE (DIM_DT_ID) INTERVAL (NUMTODSINTERVAL(1,'DAY')).

我有 9000 万行,性能很差,我们的查询 SLA 是 2 秒,我想执行分区。什么是最好的方法以及如何在整数列上启用自动分区

我们的查询将始终按这些列过滤,例如

select * from <tbname> 
where ObjectID =1346785 
and patentnumber=23456.

标签: oracleperformanceoracle12c

解决方案


“我只是在这里做一个例子,因为为了合法性我不能粘贴原始查询”

很公平,但我们给你的建议只会和你给我们的信息一样好。到目前为止,您发布的任何内容都没有表明您需要分区。

粘贴的查询将在复合索引中表现良好,并且可能会受益于前导列的压缩:

 create index your_table_lookup_index 
      on your_table(ObjectID, patentnumber) compress 1;

如果这是唯一的组合,则使索引唯一。

如何在整数列上启用自动分区

但是,如果您认为您确实有真正的分区用例,那么我们可以将间隔分区与整数和日期一起使用。该语句将为objectid每十个值创建一个分区表。

create table your_table (
      objectid   number,
      patentnumber        number,
      created_date date
)
partition by range (objectid)
interval (10)
(
   partition p_00010 values less than (10)
);

在您发布的数据中,大约有 400 个分区,每个分区大约有 225000 行。这是一个不错的选择吗?谁能告诉?你知道你的数据和你的用例,我们不知道:也许每个分区objectid(即带有interval (1))会更好。

您已经有一个表,因此您需要将其拆分为分区。这样做的标准是

  1. 使用您的分区策略(如上)创建一个新表,但默认分区范围为values less than (MAXVALUE)
  2. 使用分区交换将现有表数据移动到新结构中
  3. 删除旧表并将表重命名为旧表;解析外键和其他依赖项。
  4. 迭代地将分区拆分为所需的范围

这是一个相当耗时的过程。您已标记您的问题[oracle12c];如果您使用的是 Oracle 12c R2,您绝对应该查看它的在线转换机制,这是一个单一的命令。了解更多

请记住,为性能而分区是一个棘手的游戏。虽然它可以改进返回大量与分区键对齐的行的查询,但它对其他查询没有影响,甚至会损害它们的性能。特别是,任何不包含分区键(objectid在您的情况下)的查询在对表进行分区后可能会执行得更差。


最后一点:如您所知,但为了未来的搜索者的利益,分区是企业版许可证的额外收费。除非我们付费,否则我们不允许使用它。


推荐阅读