WEB开发网
开发学院数据库DB2 DB2 中 MQT 的匹配原理及使用技巧 阅读

DB2 中 MQT 的匹配原理及使用技巧

 2010-03-31 00:00:00 来源:WEB开发网   
核心提示: 查询中连接的表是 MQT 中的子集,需满足 RI前面提到,DB2 中 MQT 的匹配原理及使用技巧(7),MQT 匹配的前提是 MQT 仅包含且正好包含查询所需要的数据行,因此,MQT 能匹配这个查询, 在清单 5 中可以看到 MQT 和查询的详细内容,如果一个 MQT 中连接 (Join) 的

查询中连接的表是 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 匹配示意图
DB2 中 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; 

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:DB MQT 匹配

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接