【问题标题】:Oracle Auto Partition strategy on Integer column整数列上的 Oracle 自动分区策略
【发布时间】:2018-10-10 19:12:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我确定你没有 9000 万个 - 你可能是指一个表,有那么多 。您缺乏对细节的关注(关于您在此处发布的问题,寻求帮助)不是一个好兆头。然后:您想在 MORE THAN 一个列上进行分区?您在问题的末尾显示两列。这两列的值范围是多少? (如您所示,典型值很有帮助,但您需要提供更多信息才能获得有意义的答案。)
  • 抱歉进行了必要的更改..ObjectID 范围是 1 到 4010,并且专利号是一种代理键
  • 好的,那么按 ObjectID 分区应该不成问题,但按专利号分区可能会。专利号值是如何产生的?另请注意,如果 ObjectID 范围为 1 到 4010,则在您的帖子中演示通过 ObjectID=1346785 进行过滤是没有意义的。
  • Mathguy..我只是在这里做一个例子,因为为了合法性我不能粘贴原始查询..
  • @sunnybabau 该查询看起来从多列索引中受益比分区更多。分区通常最适合必须返回或处理大量数据的操作,而索引最适合返回或处理少量数据的操作。 ObjectID 的大范围,加上专利号是“一种代理键”意味着查询将只返回少量行。

标签: oracle performance oracle12c


【解决方案1】:

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

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

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

 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,您绝对应该查看它的在线转换机制,这是一个单一的命令。 Find out more.

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


除此之外:如您所知,但为了将来的 Seeker 的利益,分区是企业版许可证的额外收费。除非我们付费,否则我们不能使用它。

【讨论】:

  • 关于在线转换的好点,一定会考虑的。
  • 好点.. partition by range (objectid) interval (10) - 到目前为止从未见过或有一个需要这样做的用例:-)
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2013-07-14
相关资源
最近更新 更多