如何为具有复合索引的informix表手动运行更新统计信息?

时间:2019-11-20 05:49:21

标签: informix

假设有一个带有以下所示架构的表,其中包含大量记录。为了获得更好的性能,我手动执行更新统计信息。我需要知道对复合索引执行update statistics命令的正确方法是什么。我应该根据情况使用中高水平?

create table "informix".table1
  (
    ip_address char(15),
    mobile_no char(10),
    name char(20)
  ) in dbs1 extent size 64 next size 32 lock mode row;



create unique index "informix".idx_table1_1 on "informix".table1
    (ip_address,name) using btree  in idxdbs;

对于上表,从以下两种方法中更新统计信息的最佳方法是什么?

update statistics high for table table1(ip_address,name) force;

OR

update statistics medium for table table1(name) force;
update statistics high for table table1(ip_address) force;

2 个答案:

答案 0 :(得分:1)

Informix 12.10手册建议:

  • Using the MEDIUM mode option

      

    在表上运行UPDATE STATISTICS MEDIUM后,与仅LOW模式列分布统计信息可用于表的查询语句相比,查询优化器通常会选择效率更高的执行计划。列。

  • Using the HIGH mode option

      

    对于已经为每列提供MEDIUM模式分布统计信息的索引表,在对作为索引键一部分的每列运行UPDATE STATISTICS HIGH之后,查询优化器通常会选择更有效的执行计划。

由于ip_addressname都是唯一索引的一部分(您也应该考虑将其指定为主键),因此第一个选项(单个HIGH模式语句)可能是最合适的。无需先在同一列上运行MEDIUM模式。

测试-YMMV。

答案 1 :(得分:0)

您运行的查询是否存在性能问题?该表有多少条记录?您没有很多字段,但是通过将name字段重新定义为VARCHAR而不是CHAR并定期重建索引可能会有所改善。是否更新了任何记录,或者这是一个只是定期插入新记录的查找表?您能否向我们显示针对此表运行的查询,并向我们显示EXPLAIN文件以查看查询成本并计划查询优化器正在使用的内容?如果您要查询的是name和mobile_no字段,则可能需要在这些字段上进行索引,并且根据正在运行的查询,还可以从创建群集索引中受益。请记住,有索引时,新记录的插入和更新速度较慢,因为它也必须更新索引表。