Oracle 低基数列索引排序性能

时间:2021-03-22 12:08:24

标签: oracle performance database-design

我有一个包含 control_type 列的表,该列存储 NUMBER,并且只能具有三个值,分别为 1、2 和 3

假设该表包含大约 50 000 000 条数据,我想根据 control_type 值查询该表。 control_type 列上的索引定义排序是否会影响性能(ASC 或 DESC)?

2 个答案:

答案 0 :(得分:2)

您将永远想使用索引来查询具有三个值的列上有 50M 行的表。您需要说 17M 索引访问才能获得具有一个值的所有行(假设非偏态分布),这将花费 年龄

您需要使用并行选项来执行全表扫描

唯一的例外是,如果您的列包含倾斜数据,例如 1 几乎在所有行中,而 23 非常特殊(几千左右) - 使用低出现值的索引。

频率直方图将帮助优化器做出这个决定。

答案 1 :(得分:1)

假设值分布均匀,您建议的索引每个值将有 1700 万次点击。这不是构建索引的明智案例。索引读取对于如此大量的数据来说太昂贵了。那是在我们考虑值是聚集在一起还是散布在整个表中之前。即使 control_type 的值严重倾斜,如果值分布在整个表中,使用索引读取对少数值的查询仍可能访问表中的每个块。

几乎在所有情况下,查找给定 control_type 值的记录的最有效方法可能是全表扫描和过滤器。如果您有多个可用的 CPU,请使用并行查询,并使用 crunch 解决。

不过,如果您有一个将返回 1700 万行的查询,您可能需要重新审视需求:谁或什么对这些数据感兴趣?

另外,考虑是否可以对表进行分区? 5000 万行听起来像是一个可以从中受益的表(假设您的组织已经为 Partitioning Option 许可证而跃跃欲试)。我不是建议您在 control_type 上进行分区,但可能还有其他一些合适的列,例如交易日期?

相关问题