【发布时间】:2014-07-07 16:36:04
【问题描述】:
使用 oracle 11g。
我正在寻找一个功能,它允许我定义一个可变宽度的索引,这取决于给定值的出现率。这是用于范围扫描的非唯一索引。
即
表T是
J 列、K 列、L 列、...
索引 I 是
T 上的非唯一索引 (J (, - 如果超过 1% - K (, - 如果超过 10% - L ) ))
这样,对于低出现率(长尾)的值,索引会变窄,而对于出现率高的值,索引会变宽。
现在,当我使用 (J,K,L) 从表中进行选择时,它将使用索引并始终获得一个窄且有序的结果集。
有什么想法吗?这样的事情存在吗? 我想到了分区,但它可能很麻烦。
附:使用固定数字而不是百分比也可以。
【问题讨论】:
-
我不太清楚您希望完成什么。索引需要具有固定数量的列。您可能会创建一个基于函数的索引,该索引有时存储值,有时存储
NULL,但这并不明显这实际上会为您在索引中节省大量空间。我也不清楚“如果超过 1%”和“如果超过 10%”在这种情况下是什么意思。 -
是的。我正在寻找一种方法来获得具有非固定列数的索引。在示例中,我的意思是具有给定 J 值的行(出现超过表大小的 1%)将由 K 列进一步索引,并且具有给定 J 和 K 的行出现超过 10%表大小,将由 L 列进一步索引。这可以同时达到两个目的:平均保持索引宽度较小(有利于插入),对某些值获得良好的选择性(在这种情况下,oracle 通常会进行变量查看并诉诸全表扫描)。
-
您不能拥有具有可变列数的索引。假设 J 不为 NULL,则表中的每一行仍然有一个索引条目,因此除非 K 和 L 是特别大的列,否则不会有一个非常小的索引。索引大小与
INSERT操作的速度没有明显关系。另外,除非您要预先定义流行的值,否则您还会在INSERT操作期间花费大量时间来确定新插入的元组是否是常见的,这可能会迫使先前插入的行以不同的方式进行索引。
标签: sql oracle oracle11g indexing