2011-01-06 127 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技术很可能是一个体面的解决方法。