变宽度索引oracle

时间:2014-05-19 16:10:00

标签: sql oracle oracle11g indexing

使用oracle 11g。

我正在寻找一个能让我定义一个可变宽度的索引的特征,该索引取决于给定值的出现率。这适用于具有范围扫描的非唯一索引。

表T是

J栏,K栏,L栏,......

索引我是

T上的非唯一索引(J(, - 如果超过1% - K(, - 如果超过10% - L))

这样,对于具有低发生率(长尾)的值,指数将变窄,对于具有高发生率的值,指数将更宽。

现在当我使用(J,K,L)从表中选择时,它将使用索引并始终获得一个非常有序的结果集。

任何想法?这样的事情存在吗? 我想过分区,但它可能很麻烦。

P.S。也可以使用固定数字而不是百分比。

2 个答案:

答案 0 :(得分:1)

你不能拥有一个可变数量的列依赖于数据的索引,原因很简单,更新索引将是一场性能噩梦。

每次在索引中插入,删除或更新值时,数据库都必须确定索引中的键是否需要扩展或收缩。实际上,这可能需要对快速操作进行全表扫描。

索引中包含所有三列有什么问题?让数据库引擎担心特定的结构。

如果某些变量很长(比如长字符串),那么请考虑一个仅使用前n个字符来提高效率的功能索引。

答案 1 :(得分:0)

Index key compression可以显着减小重复值的索引的大小并提高性能。将最不具选择性的列放在最前面以获得最大的好处。

create index t_idx on t(l, k, j) compress;