使用oracle 11g .
我正在寻找一个功能,它允许我定义一个可变宽度的索引,它取决于给定值的出现率 . 这适用于具有范围扫描的非唯一索引 .
即
表T是
列J,列K,列L,......
索引我是
T上的非唯一索引(J(, - 如果大于1% - K(, - 如果大于10% - L)))
这样,对于具有低发生率(长尾)的值,指数将变窄,对于具有高发生率的值,指数将变宽 .
现在,当我使用(J,K,L)从表中选择时,它将使用索引并始终得到一个非常有序的结果集 .
有任何想法吗?这样的事情存在吗?我想过分区,但它可能很麻烦 .
附:固定数字而不是百分比也可以 .
2 回答
您不能拥有一个具有可变数量的列的索引,这些索引依赖于数据,这非常简单,因为更新索引会成为性能噩梦 .
每次在索引中插入,删除或更新值时,数据库都必须确定索引中的键是否需要扩展或收缩 . 实际上,这可能需要对应该是快速操作的全表扫描 .
在索引中包含所有三列有什么问题?让数据库引擎担心特定的结构 .
如果某些变量很长(比如长字符串),那么考虑一个仅使用前n个字符来提高效率的功能索引 .
Index key compression可以显着减小重复值的索引的大小并提高性能 . 将最不具选择性的列放在第一位以获得最大的好处 .