【问题标题】:variable width index oracle可变宽度索引预言机
【发布时间】: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


【解决方案1】:

Index key compression 可以显着减小索引的大小并提高具有重复值的索引的性能。将最不具选择性的列放在首位,才能看到最大的好处。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多