DB2 中 MQT 的匹配原理及使用技巧
2010-03-31 00:00:00 来源:WEB开发网查询中连接的表是 MQT 中的子集,需满足 RI
前面提到,MQT 匹配的前提是 MQT 仅包含且正好包含查询所需要的数据行。因此,如果一个 MQT 中连接 (Join) 的表多于查询中的表,一般不能用这个 MQT 来匹配,因为额外的 Join 操作会影响 MQT 所包含的行及对应的冗余度。然而,如果额外的 Join 操作是基于 RI(引用完整性)的,那么它不会增加或删除任何行,编译器能够利用这个事实在上述情况中匹配 MQT。这种基于 RI 的 Join 操作在事实表和维表之间是很常见的。
通过例子来说明。如图 4 所示,SALES_PROD_CUST 这个 MQT 基于外键连接了事实表 Sales 与两个维表 Product 和 Customer。而查询则是在 Sales 和 Product 的 Join 操作。这时,MQT 能匹配这个查询。 在清单 5 中可以看到 MQT 和查询的详细内容,并且打印出的执行计划和拓展诊断信息明确的显示了 SALES_PROD_CUST 在查询匹配时被利用了。
图 3. 含有额外 RI-Join 时的 MQT 匹配示意图
查看原图(大图)
清单 5. 含有额外 RI-Join 时的 MQT 匹配
--MQT definition: with extra RI-Joins
CREATE TABLE MQTSCH.SALES_PROD_CUST AS
(SELECT P.PROD_ID, CAT_DESC, AMOUNT, C.CUST_ID, CUST_NAME
FROM MQTSCH.PRODUCT P, MQTSCH.SALES S, MQTSCH.CUSTOMER C
WHERE P.PROD_ID = S.PROD_ID
AND S.CUST_ID = C.CUST_ID )
DATA INITIALLY DEFERRED REFRESH DEFERRED;
refresh table MQTSCH.SALES_PROD_CUST;
--artifical statistics
runstats on table MQTSCH.SALES_PROD_CUST;
update syscat.tables set card=10 where tabname='SALES_PROD_CUST';
--collect the explain information
DELETE FROM EXPLAIN_INSTANCE;
explain plan for SELECT P.PROD_ID, CAT_DESC, AMOUNT
FROM MQTSCH.PRODUCT P, MQTSCH.SALES S
WHERE P.PROD_ID = S.PROD_ID;
!db2exfmt -1 -d mqtdb -o join_redud.plan;
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››db2 命令选项解释
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 基础: 表空间和缓冲池
- ››DB2 XML 编程,第 1 部分: 理解 XML 数据模型
- ››DB2 pureScale 实战
更多精彩
赞助商链接