【问题标题】:Generate index on a specific value针对特定值生成索引
【发布时间】:2012-12-07 03:26:14
【问题描述】:

是否可以为数据库中的特定列值生成索引?例如,我有一个名为status 的列,其值为{0,1,2,3},但最常调用状态2,因此我想专门索引该值。这可能吗?我想语法将类似于您可以像这样按降序索引的方式:

create index foo on table(bar desc);

我可能会看到这个工作:

 create index foo on table(status 2);

这会在 SQLdeveloper 中针对 Oracle 数据库生成 missing right parenthesis 错误。

【问题讨论】:

  • 与普通字段索引相比,这在什么时候会是一个好主意?为了节省空间?
  • @voithos 所以主要问题是我的值非常有限,但我只“关心”其中的一个子集。所以我一直在寻找最好/最有效的方法来为子集而不是值域构建索引。
  • 节省空间是一个副作用,但它也可以用来避免索引非常常见的值,而基于索引的访问方法对这些值没有帮助。例如,如果 99.9% 的值是“N”,0.1% 是“Y”。

标签: sql performance oracle indexing


【解决方案1】:

基于函数的索引 ...

create index foo on table(case status when 2 then status end)

...和一个谓词...

...
where case status when 2 then status end = 2

... 就是为了这个。

这利用了从 btree 索引中省略空值的优势。如果状态为 2,则 case 表达式返回“2”,否则返回 null,因此索引仅包含状态 =“2”的条目。如您所见,您确实需要一个不同的谓词。坦率地说,其他一些 RDBMS 在这方面做得更好。

【讨论】:

  • 您能否详细说明一下:case status when 2 then status end 的确切含义?
  • 啊,我明白了,所以它会在一天结束时给我的查询增加一些复杂性。我将对此进行测试并比较时间。
  • 您可以通过将其定义为表上视图的额外列来避免复杂性,或者在字母版本中您可以在表上定义一个虚拟列并为其编制索引。
  • 我明白了,这可能要求很多,但您能提供一个虚拟列的示例吗?
  • 这里有一些很好的讨论和一些例子:asktom.oracle.com/pls/apex/…
猜你喜欢
  • 2014-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多