【发布时间】:2013-08-25 16:23:08
【问题描述】:
我在生产环境中有一个表,该表上有 2 个索引,索引中的列相同,但顺序相反。
DDL 是
- CREATE INDEX IND_1 ON ORDERS (STORE_ID,DIST_ID)
- CREATE INDEX IND_DL_1 ON ORDERS (DIST_ID,STORE_ID)
这两个索引本质上是否不相同。为什么有人会以这种方式创建索引?反转或更改列位置是否在内部执行某些操作?
【问题讨论】:
-
索引中列顺序的经验法则是您要减小子树的大小(意思是第二级及以上)!所以你想把最明显的值放在第一位。
-
这些索引看起来很适合 index compression。
-
@haki 这不是 B 树的工作方式。如果您将更具选择性的列放在复合索引的首位,您实际上不会减少节点数。顶部没有“第一列的 B-Tree 级别”,下方没有“第二列的级别”等......事实上,将选择性较低的列放在首位有助于 Oracle 索引压缩,并且可以在物理上以更有利的方式对索引进行排序方式(取决于您要如何查询)。引用 Tom Kyte 的话:“至少从第 6 版开始,最好先选择最好的就不是事实了。”
标签: oracle oracle11g oracle10g database-performance query-performance