通过索引优化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可以为我的表提供最佳结果。     
已邀请:
我也不知道Informix。您将必须进行测试。 Postgres足够聪明,可以根据需要以明显的方式单独对变量进行单独的索引扫描,并且可以(并非总是那么好)估计该方法是否比表扫描更好。但是,我怀疑5列综合指数在这里能很好地工作。 我有另一个建议:使用默认值将日期的NULL值设置为无限的极端;那么您不必使用特殊情况NULL。此外,这可能会正确捕获业务逻辑。 如果两个?表示相同的参数,您可以用
? IS BETWEEN date_from and date_to
稍微简化
(? >= date_from AND ? <= date_to)
。只是语法糖,不会影响查询计划。     
您和/或逻辑可能会使任何优化器对尝试创建有用的索引感到非常不满。 但是,您可以在Informix中创建功能索引,请参阅http://www.ibm.com/developerworks/data/library/techarticle/dm-0712wilcox/index.html。因此,对于这种方法,您将创建用户定义的函数,以便可以编写:
...
WHERE ? >= null_small_date(valid_from)
  AND ? <= null_large_date(valid_to)
  AND language = ?
  // hack, hack.  These 4 values should be the same as, but in a different order from
  // the next line .  This sanity check will let the index skip many possible records.
  AND max_date(?, ?) >= date_from AND min_date(?, ?) <= date_to
  AND ((? >= date_from AND ? <= date_to) OR (? >= date_from AND ? <= date_to)) 
  ...
考虑到这一点,您可以在
(null_small_date(valid_from), null_large_date(valid_to), language, date_from, date_to)
上创建一个串联的索引,这将使您跳过大部分结果,而只关注表的一小部分。     
我还是一个不了解Informix的人,所以这是个黑暗的镜头。根据各个列的选择性,您可能只能对其中一两个索引,以实现所需的性能。 更新统计信息值得验证。看起来Informix也支持查询提示: http://www.ibm.com/developerworks/data/zones/informix/library/techarticle/0502fan/0502fan.html 这将允许您确切指定要使用的索引。     

要回复问题请先登录注册