Sql 在Informix数据库上使用索引(索引?)

Sql 在Informix数据库上使用索引(索引?),sql,database,indexing,informix,Sql,Database,Indexing,Informix,我在Informix数据库中有一个包含500多万条记录的表 这不是实际的表,但会显示我遇到的问题 表:销售额 列:销售标识、销售确认、供应商标识、采购商标识 索引:idx1(销售id)、idx2(销售确认)、idx3(供应商id)、idx4(采购商id) 如果我执行这样的查询: select * from sales where sale_confirmed IS NULL or sale_confirmed = '' select * from sales where

我在Informix数据库中有一个包含500多万条记录的表

这不是实际的表,但会显示我遇到的问题

表:销售额
列:销售标识、销售确认、供应商标识、采购商标识
索引:idx1(销售id)、idx2(销售确认)、idx3(供应商id)、idx4(采购商id)

如果我执行这样的查询:

select *  
from sales  
where sale_confirmed IS NULL  
or sale_confirmed = '' 
select *  
from sales  
where vendor_id = 12345 
or purchaser_id = 12345
然后,查询将在大约4或5秒钟内完成

如果我执行这样的查询:

select *  
from sales  
where sale_confirmed IS NULL  
or sale_confirmed = '' 
select *  
from sales  
where vendor_id = 12345 
or purchaser_id = 12345
然后,查询将在大约4或5秒钟内完成

但是,如果我运行此查询(前两个查询的组合):

然后查询运行了15分钟,然后我取消了它

数据库似乎不够聪明,无法同时使用不同的索引,也就是说,它似乎无法使用idx2来查找X个行数,并在X个行数内使用idx3和idx4-是这样吗,我认为这样做足够聪明吗

在处理WHERE子句的第二部分时,是否有办法强制数据库使用idx3和idx4

除了创建新索引,还有其他解决方案吗


谢谢。

尝试使用一个并集,每个部分只需选择两个索引:

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 = '')
最后,我想你可能想放弃出售时的低基数指数


另外,我的数据库中通常不会有允许空字符串、NULL和其他值的列。如果您有字段,我可能会将其约束为位类型,使用1和0,默认值为0。

由于“sale\u Confirmated”的基数似乎很低(NULL,是,否?),因此“sale\u Confirmated”上的索引不太可能有用。更好的模式设计将在“sale_confirm”上强制NOTNULL,检查约束将强制执行“Y”或“N”,除非您另有指定,否则默认值将为“N”。这将避免在“已确认销售”上进行操作,因为这是一种混乱


所建议的联合技术可能是一个不错的解决办法。

您使用的是哪个版本的IDS?你的统计数据是否足够及时?您是否查看了启用“解释集”的查询计划?