为啥 DB2 不使用我的 MQT 表?

Posted

技术标签:

【中文标题】为啥 DB2 不使用我的 MQT 表?【英文标题】:Why won't DB2 use my MQT table?为什么 DB2 不使用我的 MQT 表? 【发布时间】:2009-12-05 23:30:05 【问题描述】:

我在 DB2 9.7(还没有修订包 1)中创建了一个用户维护的 MQT(物化查询表)。这是主要事实表的简单分组。但是我的查询并没有被重写以达到它。

这是我尝试过的:

创建了具有启用查询优化和由用户维护特征的 MQT 还包括 REFRESH DEFERRED 和 DATA INITIALLY DEFERRED。 (也许我不应该有?) 设置注册表变量,告诉 DB2 使用所有类型的 MQT 进行优化 运行“SET INTEGRITY for tableX ALL IMMEDIATE UNCHECKED” 运行 runstats 刷新缓存:FLUSH PACKAGE CACHE DYNAMIC 确保默认查询优化类至少为 2 级(为 5) 将默认刷新时间设置为 0(我认为这与用户定义的 MQT 无关)

然后尝试确定优化器是否会使用 MQT:

尝试了各种我希望使用 MQT 的简单查询 - 或者: 从事实表中选择 COUNT(*) 或 SELECT group-dimension, COUNT(*) FROM fact_table GROUP BY group-dimension。 解释(使用 db2expln)仅引用事实表而不是 MQT 查询结果显示计数与事实表一致,而不是 MQT 表 查询时长与事实表一致,与 MQT 表不一致。

关于判断查询是否使用 MQT 的更简单方法或我接下来应该尝试什么以使其使用它的任何建议?

【问题讨论】:

【参考方案1】:

两件事:

1) CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION 寄存器设置为什么?它默认为 DFT_MTTB_TYPES 数据库配置参数的任何值——默认值为“SYSTEM”——因此优化器将忽略您的 MQT。

2) 另外,您对DFT_REFRESH_AGE 和由用户MQT 维护的假设是错误的。 DFT_REFRESH_AGE 仍然适用 -- 对于用户维护的 MQT,CURRENT REFRESH AGE 寄存器必须设置为 ANY 才能考虑刷新延迟 MQT。

【讨论】:

1) 好提示:DFT_MTTB_TYPES 设置为 SYSTEM。我已将其和“用于优化的当前维护的表类型”都更改为 USER。还是没有效果。 2)在这里也谢谢。我将两者都定义为 any 或 99999999999999。它是 0。但是,我已经回收了数据库,刷新了缓存——但仍然没有命中 MQT。还有其他想法吗? 在我的问题、您的回答和我的第一条评论之间,任何人都可以看到这里有很多因素。在我第一次发表评论时,数据库没有使用 MQT - 但现在它是。唯一的区别是一位同事重复了我的一些步骤。也许我用尾随空格定义了 USER(不太可能)。无论如何 - 它现在正在工作。需要 20 秒的查询现在在 0.5 中运行。感谢您的提示。【参考方案2】:

要调试问题,请在查询前添加:

EXPLAIN PLAN FOR

并运行它,然后检索诊断消息:

SELECT EXPLAIN_TIME, DIAGNOSTIC_ID, MSG
    FROM TABLE(EXPLAIN_GET_MSGS(
      CAST(NULL AS VARCHAR(128)),
      CAST(NULL AS TIMESTAMP),
      CAST(NULL AS VARCHAR(128)),
      CAST(NULL AS VARCHAR(128)),
      CAST(NULL AS VARCHAR(64)),
      CAST(NULL AS CHAR(1)),
      CAST(NULL AS INTEGER),
      CAST(NULL AS INTEGER),
      'en_US'))
    AS REGISTRYINFO
    WHERE EXPLAIN_TIME >= (CURRENT TIMESTAMP - 1 HOUR)
    ORDER BY EXPLAIN_TIME desc
;

在我的情况下是:

EXPLAIN_TIME              DIAGNOSTIC_ID MSG                                                                                                                                                                                                                
------------------------- ------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2015-07-08 10:48:50.940231 1             EXP0053W  The materialized query table "DB2INST1"."XFACETATTR" was not considered for query matching because the isolation level of the query is higher than the isolation level of the materialized query table.

【讨论】:

以上是关于为啥 DB2 不使用我的 MQT 表?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 DB2 中可以有一个名为 ORDER 的列?

为啥 DB2 建议每个表空间一个表?

用的db2数据库 现在想要在一个表里面取出每一天的前一千条数据 这个select语句怎么写啊

为啥使用气流执行创建表语句时我的表不显示?

db2 我先DROP掉一张表,再重建,再LOAD数据进这张表,之后对这个表做UPDATE操作很慢,这是为啥

db2中可以实现create table A as select * from B吗