DB2 V9.7 for Linux, UNIX, and Windows

统计视图

基于成本的 DB2® 优化器使用存取方案运算符所处理的估算行数(即“基数”)来准确地估算该运算符的成本。此基数估算是优化器的成本模型的唯一最重要输入,其准确性在很大程度上取决于 RUNSTATS 实用程序从数据库收集的统计信息。

需要更复杂的统计信息来表示更复杂的关系,例如涉及表达式的比较(例如 price > MSRP + Dealer_markup)、跨多个表的关系(例如 product.name = 'Alloy wheels' and product.key = sales.product_key)或者除涉及独立属性和简单比较运算的谓词以外的任何其他内容。统计视图能够表示这些类型的复杂关系,这是因为,统计信息是根据视图返回的结果集收集的,而不是根据视图所引用的基本表收集的。

编译查询时,优化器将使该查询与可用的统计视图匹配。当优化器估算中间结果集的基数时,它将使用来自视图的统计信息来更好地进行估算。

查询不必直接引用统计视图即可让优化器使用统计视图。优化器将使用用于具体化查询表 (MQT) 的匹配机制使查询与统计视图匹配。在这方面,统计视图除了不会被永久存储、不耗用磁盘空间以及不必进行维护以外,与 MQT 非常相似。

要创建统计视图,请先创建一个视图,然后使用 ALTER VIEW 语句对该视图启用优化功能。然后,对该统计视图运行 RUNSTATS 命令,从而在系统目录表中填充该视图的统计信息。例如,要创建一个统计视图以表示星型模式中 TIME 维表与事实表之间的连接,请执行以下操作:
CREATE VIEW SV_TIME_FACT AS (
  SELECT T.* FROM TIME T, SALES S
    WHERE T.TIME_KEY = S.TIME_KEY)

ALTER VIEW SV_TIME_FACT ENABLE QUERY OPTIMIZATION

RUNSTATS ON TABLE DB2DBA.SV_TIME_FACT WITH DISTRIBUTION

对视图启用优化后,它在 SYSCAT.TABLES 目录视图中将标识为统计视图(在 PROPERTY 列的位置 13 带有“Y”)。

这个统计视图可用来改进基数估算,从而改进类似于以下的查询的存取方案并提高查询性能:
SELECT SUM(S.PRICE)
  FROM SALES S, TIME T, PRODUCT P
  WHERE
    T.TIME_KEY = S.TIME_KEY AND
    T.YEAR_MON = 200712 AND
    P.PROD_KEY = S.PROD_KEY AND
    P.PROD_DESC = 'Power drill'
如果没有统计视图,那么优化器将假定所有与特定 TIME 维 YEAR_MON 值对应的事实表 TIME_KEY 值都均匀地出现在事实表中。但是,十二月份的销售情况极佳,使得销售交易数显著多于其他月份。

目前,自动统计信息收集功能不适用于统计视图。因此,每次对统计视图所引用的基本表进行大量更新之后,请对这些视图收集统计信息。

统计视图不能直接或间接引用目录表。