基于成本的 DB2® 优化器使用存取方案运算符所处理的估算行数(即“基数”)来准确地估算该运算符的成本。此基数估算是优化器的成本模型的唯一最重要输入,其准确性在很大程度上取决于 RUNSTATS 实用程序从数据库收集的统计信息。
需要更复杂的统计信息来表示更复杂的关系,例如涉及表达式的比较(例如 price > MSRP + Dealer_markup)、跨多个表的关系(例如 product.name = 'Alloy wheels' and product.key = sales.product_key)或者除涉及独立属性和简单比较运算的谓词以外的任何其他内容。统计视图能够表示这些类型的复杂关系,这是因为,统计信息是根据视图返回的结果集收集的,而不是根据视图所引用的基本表收集的。
编译查询时,优化器将使该查询与可用的统计视图匹配。当优化器估算中间结果集的基数时,它将使用来自视图的统计信息来更好地进行估算。
查询不必直接引用统计视图即可让优化器使用统计视图。优化器将使用用于具体化查询表 (MQT) 的匹配机制使查询与统计视图匹配。在这方面,统计视图除了不会被永久存储、不耗用磁盘空间以及不必进行维护以外,与 MQT 非常相似。
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 值都均匀地出现在事实表中。但是,十二月份的销售情况极佳,使得销售交易数显著多于其他月份。目前,自动统计信息收集功能不适用于统计视图。因此,每次对统计视图所引用的基本表进行大量更新之后,请对这些视图收集统计信息。
统计视图不能直接或间接引用目录表。