在DB2优化器中使用分布统计信息
2009-12-23 15:00:17 来源:WEB开发网应为满足以下条件的列收集分布统计信息:
该列有很多重复的值(频率统计信息),或者该列的值分布不均匀,即它们在某些局部是聚合的(分位数统计信息)。
检查等于或不等于的谓词中使用到该列(频率统计信息),或者检查小于(小于等于)、大于(大于等于)或介于两个值之间的谓词中使用到该列(分位数统计信息)。
对于频率统计信息,重要的是定义好收集多少个值的重复数。如果为一个列中的所有值收集频率统计信息,那么成本就太高了。如果在执行 RUNSTATS 时没有显式定义数量,那么 DB2 将使用由数据库参数 NUM_FREQVALUES 提供的默认数量。由于 NUM_FREQVALUES 的默认值为 10,DB2 将为列中出现最频率的 10 个值收集重复次数,这里假定 RUNSTATS 是在没有显式定义数量,且数据库参数 NUM_FREQVALUES 没有被修改的情况下执行的。
与频率统计信息类似,也必须为分位数统计信息定义一个数量,以保证精确性。分位数统计信息定义应该使用多少 “度量值(measurement)“。列中的值被认为是按升序排列的,并且有一个正则的行间隔,相应的值是确定的。使用的度量值越多,优化器对于检查范围(<、>、<=、>=、BETWEEN)的谓词的过滤因子的估计就越准确。如果在执行 RUNSTATS 时没有明确指定一个值,那么 DB2 将使用由数据库参数 NUM_QUANTILES 提供的默认数量。NUM_QUANTILES 的默认值是 20,也就是说使用 20 个度量值。这已经是一个较好的值,因为它可以保证优化器在使用分位数统计信息的情况下对确定过滤因子的估计误差最大只有 5%。
如果数据库配置(DB CFG)不能提供 NUM_FREQVALUES 和 NUM_QUANTILES 的值,那么可以在执行 RUNSTATS 时显式定义:
RUNSTATS ON TABLE SAMPLE.CARS WITH DISTRIBUTION ON COLUMNS (TYPE NUM_FREQVALUES 10 NUM_QUANTILES 20, STATE NUM_FREQVALUES 15 NUM_QUANTILES 30) AND INDEXES ALL
如何检查是否存在分布统计信息
为检查某个表的分布统计信息是否已收集,可以查看分类视图 SYSCAT.COLDIST 的内容:
SELECT * FROM SYSCAT.COLDIST WHERE TABSCHEMA = 'SAMPLE' AND TABNAME = 'CARS'
视图 SYSCAT.COLDIST 结构如下:
表 4. SYSCAT.COLDIST 的结构
列名 | 数据类型 | 是否可以为空 | 描述 |
TABSCHEMA | VARCHAR(128) | 不可以 | 本条目对应的表的限定符 |
TABNAME | VARCHAR(128) | 不可以 | 本条目对应的表的名称 |
COLNAME | VARCHAR(128) | 不可以 | 本条目对应的列的名称 |
TYPE | CHAR(1) | 不可以 | F = Frequency(最大频率)
Q = 分位数值 |
SEQNO | SMALLINT | 不可以 | 如果 TYPE = F,则该列中的 N 表示第 N 频繁的值
如果 TYPE = Q,那么该列中的 N 表示第 N 个分位数值 |
COLVALUE | VARCHAR(254) | 可以 | 数据值,其形式为字符字面值,或者一个 NULL 值 |
VALCOUNT | BIGINT | 不可以 | 如果 TYPE = F,那么 VALCOUNT 是 COLVALUE 出现在该列中的次数
如果 TYPE = Q,那么 VALCOUNT 是其值小于或等于 COLVALUE 的行的数量 |
DISTCOUNT | BIGINT | 可以 | 如果 TYPE = Q,那么该列记录小于或等于 COLVALUE 的不同值的数量(如果没有,则为 NULL) |
更多精彩
赞助商链接