在Informix DB上使用索引(索引?)
我有一个在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显式地的一种方式?
任何其他解决方案都不足以创建新索引?
谢谢。
与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。
使用UNION的+1。 – 2011-01-06 15:02:07
的指数“sale_confirmed”不太可能是有用的,因为“sale_confirmed”基数似乎较低(NULL,是的,不是吗?)。更好的模式设计会在'sale_confirmed'上强制执行NOT NULL,CHECK约束强制执行'Y'或'N',除非另有指定,否则默认设置可能会给出'N'。这将避免必须对'sale_confirmed'进行OR操作,这很麻烦。
通过Tim建议的UNION技术很可能是一个体面的解决方法。
您使用的是哪个版本的IDS?你的统计数据是否足够及时?您是否使用SET EXPLAIN ON查看了查询计划? – 2011-01-06 15:02:36