2012-12-19 28 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