Integer列上的Oracle Auto Partition策略

时间:2018-04-30 16:42:42

标签: oracle performance oracle12c

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

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

我们的查询将始终按照

这些列进行过滤
select * from <tbname> 
where ObjectID =1346785 
and patentnumber=23456.

1 个答案:

答案 0 :(得分:4)

  

&#34;我只是在这里做一个例子,因为为了合法性而无法粘贴原始查询&#34;

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

粘贴的查询在复合索引中表现良好,可能会受到前导列压缩的好处:

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

如果这是一个独特的组合,那么使索引唯一。

  

如何在Integer列上启用自动分区

但是,如果您认为确实有分区的真实用例,那么我们可以使用带有整数和日期的间隔分区。此语句将创建一个在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. 将分区迭代地拆分为所需范围
  5. 这是一个相当耗时的过程。您已标记了问题[oracle12c];如果你正在使用Oracle 12c R2,你一定要看看它的在线转换机制,这是一个单一的命令。 Find out more

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

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