Informix-Online数据库的查询优化策略( 二 )


由此可见,优化器的丰富功能为我们提供了灵活的手段,管理员可以根据不同应用情况选择最佳的方式,既能达到最佳的查询效果,又能将由此而造成的系统开销降至最低 。
2.进行统计更新和数据分布
当数据库表做了大量的插入、删除操作或表的索引发生变化后,Online数据库系统表的相关信息与实际表的统计数字不一致,这对数据的完整性没有任何损害,但会影响到查询的速度 。因为优化器所制定的计划和策略得以正确实施的前提是对系统表信息的精确读取,统计信息的正确性将直接影响到查询的执行效果,因此我们必须定期执行系统表信息的统计更新工作 。此外还要经常做好数据分布工作,使数据的组织形式更为合理 。通过数据分布,优化器可以根据有关信息确定如下内容:过滤器字段的选择率(Selectivity)、访问过滤器字段和表的策略、最佳的连接策略 。一旦确定这些内容,查询的执行时间将会显著缩短 。
进行统计更新和数据分布的唯一方法是运行SQL命令:Update Statistics……,其结果是:IDS 流览表和索引,一方面对统计信息加以编译,最终将编译好的信息存储到相应的系统表中,另一方面读取表中记录并对其进行排序以生成最好的组织形式 。具体格式如下:
Update Statistics [ High | Medium | Low ] [ Distributions Only ] [ for table tabname [ (fIEld1,field2……) ] ]
其中,High对表中的所有记录进行排序以产生数据分布 。
Medium随时从表中选取部分记录进行排序以产生数据分布 。
Low仅执行统计更新,即仅修改系统表systables、sysindexes、syscolumns的内容,但不进行数据分布 。
Distributions Only进行数据分布和部分统计更新工作,不更新系统表sysindexes的内容 。
为实现科学有效的统计更新和数据分布,通常应执行以下优化步骤:
(1)针对每张表运行
Update Statistics Medium for table tabname Distributions Only
(2)针对每张表中带索引的第一个字段运行
Update Statistics High for table tabname (fieldname)
(3)对某些表中带复合索引的每一个字段运行
Update Statistics Low for table tabname (fieldname1,fieldname2……)
以上顺序非常重要,不能搞错 。为方便运行,我们可以将以上命令按顺序写入到一个shell程序文件中,让操作系统在每日数据最少改动时间定时运行该程序 。
3.使用SQL语句缓存(SSC,SQL Statement Cache)功能
SSC是Informix IDS2000 V9中增加的新功能,提供了共享的语句缓存,从而实现了快速的SQL调用 。传统情况下,每条SQL语句运行前都要进行逻辑分析以判断语法正误,还要在共享内存中为各语句分配空间 。实践表明,无论是OLTP还是DSS应用,大量运行的SQL语句具有相同的格式,通过SSC,重复的SQL语句可以单一在共享内存中存储及共享使用,这样不仅大大减少了大量语句的分析过程,使查询的速度明显加快,而且节省了大量共享内存空间,带来了其他应用效果的改善 。SSC的使用方法如下 。
(1) 在IDS配置文件$ONCONFIG中定义
STMT_CACHE 1
或运行SQL命令:onmode -e enable 以激活SSC功能 。
(2)用户使用前还必须定义环境变量STMT_CACHE
export STMT_CACHE = 1
或运行SQL命令:set statement cache on
经过以上设置后,所有的查询都将充分基于SSC进行高效处理 。
三、查看优化结果
查询优化器给用户提供了大量详尽的关于优化的信息,包括:
1.连接过程中的开销估计
2.查询过程中表的使用顺序(即查询路径)
3.查询过程中用到的临时表
4.对每个表的访问类型,如:顺序扫描、索引扫描、哈希连接等
一名合格的系统管理员应熟知每一项信息所代表的含义,并进行反复的优化和输出比较方可制定出最佳的优化方案 。为使系统提供以上信息,要求执行查询前先运行SQL命令:set explain on,查询完毕后再运行:set explain off,这样在用户当前工作目录下会生成一个包含以上信息sqlexplain.out文本文件 。通过该文件内容,管理员可清楚地看到经过优化后的查询效果 。

推荐阅读