给定 NDV(不同值的数量)的最佳索引组合
Posted
技术标签:
【中文标题】给定 NDV(不同值的数量)的最佳索引组合【英文标题】:Best Index Combinations, given NDV (number of distinct values) 【发布时间】:2019-06-26 14:39:11 【问题描述】:我有一个包含 200 万行的只读 Oracle 表。
NDV(每个列的不同值的数量如下)
C1 : 2
C2 : 40000
C3 : 40
C4 : 10000
C5 : 10000
C6 : 2
假设查询对上述所有列进行搜索。
考虑到上述情况,最好的综合指数组合是什么?
另外 - 忽略 DML 会因为更多索引而变慢的事实,因为数据库始终处于 READ_ONLY 模式。
【问题讨论】:
如果您要搜索所有列,那么您希望将所有列包含在索引中。列的顺序对性能几乎没有影响。 @GordonLinoff - 如果第一列是 C2 (它的 NDV=40,000 ),查询不会转到 B-tree 的高度选择性部分吗?另一方面,如果 C1 是索引的第一列 - 它仍然需要对 40,000 个值进行排序 。 . “去”是描述发生的事情的一种奇怪方式。所有六个键都在根处进行比较,如果不需要所有六个键,可能会使用快捷方式。然后在后续节点重复此操作。捷径可能受益于首先拥有更高的基数键。但这也受数据类型、键的长度和比较规则的影响,因此还有其他考虑因素。我会考虑对使用所有六个键的查询进行微优化。 查询在 where 子句中使用了哪些运算符 =、、like、>、 【参考方案1】:我认为对多列索引的列进行排序的最佳方法是查看针对特定表的所有查询,并将在 WHERE 子句中最常引用的列放在列列表的前面。 -- 索引压缩是另一个考虑因素:将 C1、C6 和 C3 放在前面可能会提供更小的索引。 -- 但如果没有其他考虑因素,我可能会将 C2、C4 和 C5 放在前面。
【讨论】:
【参考方案2】:我了解到的更多信息 - 应该包含在问题描述中。
原来数据库是只读数据库。因此,当我们的表中的列数很少且基数非常低时,它就非常适合 BIT-MAPPED 索引。
我在 C1、C3、C6 列上创建了位映射索引,它确实提高了性能。
【讨论】:
以上是关于给定 NDV(不同值的数量)的最佳索引组合的主要内容,如果未能解决你的问题,请参考以下文章
设有各不同面值人民币若干,编写一个java程序,对任意输入的一个金额,给出能组合出这个值的最佳可能
设有各面值不同人民币若干,对任意输入的金额,给出能组合出这个值的最佳可能,要求使用的币值个数最少,如:1.46元 1元1个 2角2个 5分1个 1分1个