zoukankan      html  css  js  c++  java
  • db2 统计信息 runstats

    1.runstats的语法:
    runstats on table [模式名].[表名] with distribution and detailed indexes all
    注意:你可以在所有列上,或者仅仅在某些列或列组(除了LONG和LOB列)上执行RUNSTATS。
    如果没有指定特定列的子句,系统则会使用默认的ON ALL COLUMNS子句。
    使用RUNSTATS WITH DISTRIBUTION
    当您已确定表中包含不是统一分布的数据时,可以运行包含WITH DISTRIBUTION子句的RUNSTATS。
    目录统计信息表通常包含关于表中最高和最低值的信息,而优化器假定数据值是在两个端点值之间均匀分布的。
    然而,如果数据值彼此之间差异较大,或者群集在某些点上,或者是碰到许多重复的数据值,
    那么优化器就无法选择一个最佳的访问路径,除非收集了分布统计信息。
    使用WITH DISTRIBUTION子句还可以帮助查询处理没有参数标志符(parameter marker)或主机变量的谓词,
    因为优化器仍然不知道运行时的值是有许多行,还是只有少数行。
    如果为单一索引进行runstats,可以使用:
    runstats on table [模式名].[表名] for indexes [索引名]

    2.runstats的作用:
    一个SQL在写完并运行之后,其实我们只是告诉了DB2去做什么,而不是如何去做。
    而,具体的如何去做,就取决于优化器。优化器为了生成最优的执行计划,就得掌握当前的系统信息,目录中的统计信息等等。
    runstats命令就是用来收集数据库对象的状态信息,这对优化器生成最优的执行计划至关重要。

    3.什么时候需要runstats:
    ·在给表创建一个index后,我们最好做一次runstat,否则可能index没有生效。不过有说法称在8.2版本以后的DB2中,会在INDEX之后自动进行runstats;
    ·.在对table做了一次reorg后,记得要做一次runstats。因为对表做reorg,会修改表的很多信息,比如高水位等,所以做一次runstats,可以更新统计信息。
    ·当表里数据发生了比较大的变化,一般来说,大约表里面的数据量的10%-20%发生了变化,就应该作一次runstats。这些变化包括删除,修改,插入。
         对于一些非常大的表,比方在数据仓库的项目里面,某些事实表非常巨大。这个时候,完整的对一个大表作runstats可能花费时间相当大,
         DB2 8.1里面支持我们对这些大表作抽样,比方说只对20%的数据作runstats,这样的话,一般来说也能保证得到正确的执行计划。
         当然首先要确保这个表里面的数据最好分布比较均匀。
    ·.当你在分区(DPF)数据库里面使用了REDISTRIBUTE DATABASE PARTITION GROUP这个命令,那么就需要用runstats来收集新的统计信息。

    4.其他
    当表比较小的时候,runstats是一件很普通的事情。但是当表非常大的时候,runstats将会占用相当大的时间,cpu和内存。
    通常只在关键查询的速度开始减慢时,管理员才会对RUNSTATS给予适当的注意。
    您可以通过制定高效、有效收集统计信息的策略,避免未经思考就调优查询和执行RUNSTATS。

  • 相关阅读:
    POJ 1458 Common Subsequence 【最长公共子序列】
    Codeforces Round #283 (Div. 2) A
    HDU 1009 FatMouse' Trade【贪心】
    HDU 2037 今年暑假不AC【贪心】
    Codeforces Round #282 (Div. 2) A
    HDU 2955 Robberies【01背包】
    bzoj4811
    bzoj2243
    bzoj2325
    bzoj3531
  • 原文地址:https://www.cnblogs.com/BradMiller/p/3198086.html
Copyright © 2011-2022 走看看