【问题标题】:Should I use oracle partition if i have to query using column not used in partition clause如果我必须使用分区子句中未使用的列进行查询,我应该使用 oracle 分区吗
【发布时间】:2019-10-08 06:35:26
【问题描述】:

我有一个包含 2 亿条记录的客户表。有三个客户来源(7000 万、8000 万和 5000 万条记录)。

我在这张表上有三个查询。

  • 根据customeridsource 获取客户详细信息。
  • 第二次根据sourceaccountid获取客户详细信息。
  • 第三个通过手机号码获取客户详细信息。

我应该在这个表上使用列表分区吗,我按source 分区?通过手机号码获取客户的查询在分区后会变慢。插入没有分区的记录需要很长时间。

客户表中存在以下列:

customerid number(12), 
source varchar2(100), 
accountid number(12), 
mobile number(10). 

每个客户记录都有不同的customeridsourceaccountid 组合。

【问题讨论】:

  • 为了将来参考,请使用数千和数百万来表示大数,而不是数以亿计,因为后者在印度以外并不常见。

标签: oracle performance partitioning


【解决方案1】:

如果我必须使用分区子句中未使用的列进行查询,是否应该使用 oracle 分区

可能不会。分区主要是一种管理工具,用于处理大量数据并使其保持可用。分区的性能影响可以是消极的也可以是积极的,特别是对于不按分区键过滤的查询(就像您对手机号码的查询一样)。

无论如何,我怀疑在source 上进行分区会大大提高任何查询的性能。分区修剪的选择性不够,无法带来明显的好处。

在这两种情况下,(source, customerid)(source, accountid)compress 1 的复合索引可能更有用。正是因为source 没有选择性,所以压缩索引的前导列是值得的。也是(mobile) 上的单列索引(没有压缩)。

顺便说一句,为什么source 被定义为varchar2(100)?对于三价标识符来说,这似乎太长了。它应该是一个(或两个或三个)字符代码(如果需要,带有完整描述的查找表)。我认为这可以解释为什么它“插入没有分区的记录需要很长时间”。解决这个问题应该是您努力的重点。

【讨论】:

    【解决方案2】:

    在我看来,这些列上的no partition + indexes 将是我的选择(有您提供的信息)。

    此外,“分区”意味着“很多钱”,因为您必须拥有企业版 (EE),而分区(据我所知)是已经很昂贵的 EE 的附加组件。所以...我并不是说您(或您的公司)没有这笔钱,而是指出这可能会成为一个问题。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多