通过索引优化SELECT
|
我有一张大约有700万行的大表(还在不断增加)。我正在尝试尽可能快地优化SELECT。 SELECT来自单个表,没有联接。数据库是IBM Informix。 SELECT速度是优先事项,但是表中的插入次数相当稳定。
WHERE中有23个参数,但我已经将日期和语言标识为值得索引的参数:
...
WHERE (? >= valid_from OR valid_from IS NULL)
AND (? <= valid_to OR valid_to IS NULL)
AND ((? >= date_from AND ? <= date_to) OR (? >= date_from AND ? <= date_to))
AND language = ?
...
现在,在其上创建索引的最佳方法是什么?
是否可以从valid_from,valid_to,date_from,date_to和语言创建索引?还是创建三个复合索引(valid_from,valid_to),(date_from,date_to)和语言?还是我要用全部五个创建一个大型综合索引?所有字段均为必填项。
比较日期的索引是一个好主意,还是仅将我限制为使用=(完全匹配)的那些字段?
如果使用复合索引,我想复合索引中字段的顺序很重要-如何对索引中的列进行排序? date_from和date_to列将使我得到最大的首次减少,但是语言可能使我得到最大的减少(尽管这是我凭空提出的假设-参见问题2)。
如果有多个索引,那么Informix是使用所有索引还是仅使用一个(以及哪个索引)?
我的测试表明,WHERE中的条件顺序并不重要,但是我可能错了-是吗?
WHERE中的某些条件在已设置的列上。 Informix不允许我索引这些列。这是否意味着通过顺序扫描可以匹配这些条件?将它们移动到单独的表并加入它们在速度方面有意义吗?
到目前为止,我已经完成了什么:
显然,没有联接,这是一个非规范化表。我为此付出了要插入的更多行数,这对我来说很好,因为更新对时间不敏感。
我正在使用相当大的Informix扩展区来避免碎片,而pagesize可以为我的表提供最佳结果。
没有找到相关结果
已邀请:
3 个回复
僻朵庙惩竣
稍微简化
。只是语法糖,不会影响查询计划。
缕嚏冻
考虑到这一点,您可以在
上创建一个串联的索引,这将使您跳过大部分结果,而只关注表的一小部分。
悲帽慑彤电