2012-12-19 25 views
3

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

create index foo on table(bar desc); 

我可能会看到这样的工作:

create index foo on table(status 2); 

这生成的SQLDeveloper一个missing right parenthesis错误针对Oracle数据库。

+0

什么时候这是一个好主意,而不是一个正常的字段索引?节省空间? – voithos

+0

@voithos所以主要问题是我的数值非常有限,但我只关心这些数值的一部分。所以我一直在寻找最佳/最有效的方式来为子集建立索引,而不是价值的宇宙。 – Woot4Moo

+0

节省空间是一个副作用,但它也可以用于避免对基于索引的访问方法无用的非常常见的值进行索引。例如,如果99.9%的值是“N”并且0.1%是“Y”。 –

回答

6

函数的索引...

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,因此索引仅包含status =“2”的条目。如你所见,你确实需要一个不同的谓词。坦率地说,其他一些关系型数据库管理系统在这方面做得比较好。

+0

您能详细说明一下:'2状态结束时的情况状态'是否意味着什么? – Woot4Moo

+0

扩大了答案 –

+0

啊我明白了,所以在一天结束的时候它会增加我的查询的复杂性。我会对此进行测试并比较时间。 – Woot4Moo