保险数据库

【挑战问题】DB2物化查询表(MQT)经验点滴 欢迎讨论!

MQT 物化查询表 序言什么是物化查询表,作用是什么.物化查询表(MQT)的定义是以一次查询的结果为基础的。MQT 可以显著提高查询的性能。物化查询表可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么就会重写查询,...显示全部
MQT 物化查询表

序言

什么是物化查询表,作用是什么.

物化查询表(MQT)的定义是以一次查询的结果为基础的。MQT 可以显著提高查询的性能。

物化查询表可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么就会重写查询,以便利用 MQT。

但是我们在实际项目中要使用他, 为达到查询高效,和高性能和高稳定, 他以什么要的机制去刷新数据,和保证数据的高效性, 还有创建他有什么依赖和限制等等. 下面让我们一起来讨论

物化查询表简介

首先我们先介绍 物化查询表基本概念:

MQT

物化查询表(MQT)是一种以一次查询的结果为基础定义的表。包含在物化查询表中的数据来自定义物化查询表时所基于的一个或多个表。而 总结表(也称自动总结表,AST)对于 IBM? DB2? Universal Database?(UDB)for Linux、 UNIX? 和 Windows?(DB2 UDB)的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。


您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上则是将查询结果保存为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。


物化查询表可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么就会重写查询,以便利用 MQT。


MQT 可以在创建表时定义,或者定义为系统维护的 MQT,或者定义为用户维护的 MQT。下面的几个小节将介绍这两种类型的 MQT,另外再介绍总结表和 staging 表。后面的例子要求连接到 SAMPLE 数据库。如果您系统上还没有创建 SAMPLE 数据库,那么可以通过在命令行提示符下输入 db2sampl 命令来创建这个数据库。

收起
参与25

查看其它 23 个回答weixiaom的回答

weixiaomweixiaom高级架构师泰康养老保险股份有限公司

创建登台表时可能会发生此错误。在这种情况下,该错误适用于在与登台表相关

联的具体化查询表的定义中使用的查询。


因为该语句违反下列原因码所指示的限制,所以不能对其进行处理:


1
每个选择列表元素必须有名称。


2
全查询不能引用下列任何对象类型:


具体化查询表


登台表


声明的全局临时表


类型表


系统目录表


违反任何具体化查询表限制的视图


受保护的表

使用 CREATE NICKNAME 或 ALTER NICKNAME 语句中的 DISALLOW


CACHING 子句创建的昵称


直接或间接依赖于受保护表的视图



3
全查询不能包含下列数据类型的任何列引用或表达式:


LOB、LONG、DATALINK、XML、引用、用户定义的结构化类型或基于


这些数据类型的任何单值类型



4
全查询不能包含符合以下条件的任何列引用、表达式或函数:


取决于数据的物理特征,例如 DBPARTITIONNUM、HASHEDVALUE、RID


_BIT 和 RID


取决于对数据所作的更改,例如行更改表达式或 ROW CHANGE


TIMESTAMP 列


被定义为 EXTERNAL ACTION

被定义为 LANGUAGE SQL、CONTAINS SQL、READS SQL DATA 或


MODIFIES SQL DATA



5
当指定 REPLICATED 时,下列限制适用:


不允许聚集函数和 GROUP BY 子句


具体化查询表只能引用单个表;即,它不能包括连接、并集或子查询


不能指定 PARTITIONING KEY 子句



6
指定 REFRESH IMMEDIATE 时,全查询不能包含:


对昵称的引用


SELECT DISTINCT


对专用寄存器的引用


对全局变量的引用


不具确定性的函数

OLAP 函数、抽样函数和文本函数



使用聚集函数的结果的任何表达式


没有还包含 GROUP BY 子句的全查询的聚集函数


递归公共表表达式


子查询



7
当指定 REFRESH IMMEDIATE 时:



具体化查询表不能包含重复行



当指定 GROUP BY 子句时,所有 GROUP BY 荐必须包括在选择列表中


当指定包含 GROUPING SETS、CUBE 或 ROLLUP 的 GROUP BY 子句时


,不能重复任何分组集合,并且如果 C 是出现在 GROUPING SETS、


CUBE 或 ROLLUP 中的可空 GROUP BY 项,那么 GROUPING(C) 必须


出现在选择列表中


如果没有 GROUP BY 子句,那么每个基础表必须至少定义一个唯一


键,而且这些键的所有列必须出现在具体化查询表定义的选择列表




8
如果指定 REFRESH IMMEDIATE,那么在全查询包含 GROUP BY 子句时下


列限制适用:


选择列表必须包含 COUNT(*) 或 COUNT_BIG(*)

对于每个可空列 C,如果选择列表包含 SUM(C),那么还需要


COUNT(C)



必须出现至少下列其中一个聚集函数(并且没有其他聚集函数):


SUM()、COUNT()、COUNT_BIG() 或 GROUPING()


不能指定 HAVING 子句


在分区数据库环境中,GROUP BY 列必须包含具体化查询表的分区键

不允许聚集函数的嵌套



9
如果指定 REFRESH IMMEDIATE,那么全查询必须是子查询,但存在一个


例外,就是 UNION ALL 在 GROUP BY 的输入表表达式中受支持。


10
如果指定了 REFRESH IMMEDIATE 并且 FROM 子句引用了多个表,那么


只支持内连接(不使用显式 INNER JOIN 语法)。


11
如果指定 REFRESH IMMEDIATE,那么 UNION ALL 或 JOIN 的输入表表


达式不能包含聚集函数。


12
此具体化查询表的增量备份维护需要系统临时表,该表的行宽或列数超


出数据库上当前可用的最大系统临时表空间可以容纳的限制。


用户响应:


更改 CREATE TABLE 语句中的全查询,以使其符合基于具体化查询表选项和该具

体化查询表是否是复制的规则。


与原因码对应的操作是:


1
更正 CREATE TABLE 语句以确保所有元素都有名称(可使用 AS 子句


来命名表达式或对具体化查询表定义的列列表中的所有列显式命名)。


2
更正 CREATE TABLE 语句以确保只引用受支持的对象。


3
更正 CREATE TABLE 语句以确保只引用受支持的列或表达式类型。


4
更正 CREATE TABLE 语句以确保只引用受支持的列、表达式或函数。


5
创建未复制的具体化查询表,或更正 CREATE TABLE 语句以确保该查询


引用单个表而且不包含子查询、聚集或 PARTITIONING 子句。


6
将具体化查询表创建为 REFRESH DEFERRED,或者


除去昵称引用


除去 DISTINCT



除去专用寄存器



除去非确定性函数或将其替换为确定性函数



除去所有 OLAP、抽样函数和文本函数



从表达式中除去聚集函数或将表达式更改为对聚集函数的简单引用



除去聚集函数或添加 GROUP BY 子句


更正 CREATE TABLE 语句以确保未引用递归公共表表达式



除去子查询

保险 · 2011-05-18
浏览787

回答者

weixiaom
高级架构师泰康养老保险股份有限公司
擅长领域: 数据库云计算信创

weixiaom 最近回答过的问题

回答状态

  • 发布时间:2011-05-18
  • 关注会员:1 人
  • 回答浏览:787
  • X社区推广