在DB2优化器中使用分布统计信息
2009-12-23 15:00:17 来源:WEB开发网这个访问计划的成本明显低于没有分布统计信息时的成本:前者为 203.809,而后者为 3242.63。这是因为优化器现在知道,谓词 STATE < 100 有一个较高的过滤因子,因而只会返回大约 1,000 辆正处在生产流程中尚未完工的汽车。因此,在这种情况下,CARS 表不是使用索引 I_TYPE 来访问的,而是使用索引 I_STATE 来访问的。此外,现在可以正确地估计结果集中的总行数。现有 1,000 辆汽车尚未完工,不同的型号出现频率相同。故结果集中包含大约 100 行。
有分布统计信息时的访问计划要优于没有分布统计信息时的访问计划。但是,这是否会影响查询的执行时间?清单 2 包含相应的监视器数据快照:
清单 2. 有分布统计信息时的示例查询快照
Number of executions = 1
Number of compilations = 1
Worst preparation time (ms) = 9
Best preparation time (ms) = 9
Internal rows deleted = 0
Internal rows inserted = 0
Rows read = 1000
Internal rows updated = 0
Rows written = 0
Statement sorts = 1
Statement sort overflows = 0
Total sort time = 5
Buffer pool data logical reads = 11
Buffer pool data physical reads = 10
Buffer pool temporary data logical reads = 0
Buffer pool temporary data physical reads = 0
Buffer pool index logical reads = 12
Buffer pool index physical reads = 9
Buffer pool temporary index logical reads = 0
Buffer pool temporary index physical reads = 0
Total execution time (sec.ms) = 0.014597
Total user cpu time (sec.ms) = 0.000000
Total system cpu time (sec.ms) = 0.010014
Statement text = SELECT ID, TYPE, STATE FROM SAMPLE.CARS
WHERE STATE < 100 AND TYPE = 'A'
表 3 比较了有分布统计信息和没有分布统计信息这两种不同情况下的快照监视器值:
表 3. 比较快照监视器值
快照值 | 无分布统计信息 | 有分布统计信息 |
Rows read | 99,336 | 1,000 |
Buffer pool data logical reads | 8,701 | 11 |
Buffer pool index logical reads | 165 | 12 |
Total execution time (sec.ms) | 0.530903 | 0.014597 |
您可以看到,有分布统计信息的情况下,DB2 执行查询时需要计算的行数更少。这对于 CPU 成本和 I/O 成本都有积极的影响。最重要的是总执行成本,因为总执行成本关系到应用程序的响应时间。在具有分布统计信息的情况下,这个时间是 0.014597 秒,而在没有分布统计信息的情况下,这个时间是 0.530903,相差 36 倍之多。
在我们的示例中,两种情况下的执行时间分别为 0.014597 秒和 0.530903 秒,这个差距还不够明显,因为这两个值只是次秒级的。然而,这样的差距不应被忽略。如果要执行更复杂的查询,或者要连续执行多个查询,那么执行时间的差距就不是次秒级的,而是以秒甚至分钟来计算的。
分布统计信息的生成
如前所述,在使用 RUNSTATS 命令生成统计信息时,并不是 总会收集分布统计信息。这是有意义的,因为仅在存在很多重复值或者数据分布不均匀的情况下,分布统计信息才重要。而在其他情况下,分布统计信息并不能带来多大的好处。
下面的 RUNSTATS 命令只收集 CARS 表(在模式 SAMPLE 中)和相应索引的基本统计信息:
RUNSTATS ON TABLE SAMPLE.CARS AND INDEXES ALL
此外,如果需要收集 CARS 表中所有列的分布统计信息(频率统计信息和分位数统计信息),那么可以执行以下命令:
RUNSTATS ON TABLE SAMPLE.CARS WITH DISTRIBUTION AND INDEXES ALL
生成分布统计信息意味着给 DB2 带来额外的、可观的开销,从而影响 RUNSTATS 命令的执行时间。所以,应该只为那些需要分布统计信息的列生成分布统计信息。
RUNSTATS ON TABLE SAMPLE.CARS WITH DISTRIBUTION ON COLUMNS (TYPE, STATE) AND INDEXES ALL
更多精彩
赞助商链接