2011-01-06 175 views
1

我有一個在Informix數據庫上有500萬條記錄的表。在Informix DB上使用索引(索引?)

這不是實際的表格,但會顯示我遇到的問題。

表:銷售
列:sale_id,sale_confirmed,VENDOR_ID,purchaser_id
指標:IDX1(sale_id),IDX2(sale_confirmed)的idx3(VENDOR_ID),idx4顯式地(purchaser_id)

如果我做一個查詢像這樣:

select * 
from sales 
where sale_confirmed IS NULL 
or sale_confirmed = '' 

然後查詢在約4或5秒內完成。

如果我不喜歡這樣的查詢:

select * 
from sales 
where vendor_id = 12345 
or purchaser_id = 12345 

那麼查詢運行完成的約4秒或5秒。

但是,如果我運行此查詢(前面2個查詢的組合):

select * 
from sales 
where (sale_confirmed IS NULL 
     or sale_confirmed = '') 
and (vendor_id = 12345 
     or purchaser_id = 12345) 

然後查詢運行15分鐘之前,我取消它。

數據庫似乎不夠聰明,可以串聯使用不同的索引,即它似乎無法使用idx2來查找X行並在該X行內使用idx3和idx4 - 這是對的,我會認爲這樣做會很聰明嗎?

是否有強制數據庫處理WHERE子句的第二部分時使用的idx3和idx4顯式地的一種方式?

任何其他解決方案都不足以創建新索引?

謝謝。

+0

您使用的是哪個版本的IDS?你的統計數據是否足夠及時?您是否使用SET EXPLAIN ON查看了查詢計劃? – 2011-01-06 15:02:36

回答

2

與UNION只有兩個指標必須從每個部分選擇嘗試:

select * 
from sales 
where (sale_confirmed IS NULL 
     or sale_confirmed = '') 
and vendor_id = 12345 


UNION 

select * 
from sales 
where (sale_confirmed IS NULL 
     or sale_confirmed = '') 
and purchaser_id = 12345 

如果Informix的支持嵌入式的意見,得到了一套基於賣方/買方行,然後從設置排除未確認的銷售。

select inlineview.* from 
(
select * from sales 
where vendor_id = 12345 or purchaser_id = 12345 
) as inlineview 
where (sale_confirmed IS NULL or sale_confirmed = '') 

最後,我想你可能想要降低sale_confirmed上的低基數指數。

P.S.我通常沒有在我的數據庫中允許空字符串,NULL和其他值的列。如果有的話,我會將字段限制爲BIT類型,其中1和0,默認值爲0。

+0

使用UNION的+1。 – 2011-01-06 15:02:07

1

的指數「sale_confirmed」不太可能是有用的,因爲「sale_confirmed」基數似乎較低(NULL,是的,不是嗎?)。更好的模式設計會在'sale_confirmed'上強制執行NOT NULL,CHECK約束強制執行'Y'或'N',除非另有指定,否則默認設置可能會給出'N'。這將避免必須對'sale_confirmed'進行OR操作,這很麻煩。

通過Tim建議的UNION技術很可能是一個體面的解決方法。