【问题标题】:DB2 create staging table for MQT(Materialized Query Table) for incremental refreshDB2 为 MQT(Materialized Query Table)创建临时表以进行增量刷新
【发布时间】:2019-07-16 14:43:20
【问题描述】:

如何为 MQT(物化查询表)创建临时表?

目标是使用增量刷新(而不是完全刷新)

这是 IBMi 上的 DB2

我一直在关注这篇文章 https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.7.0/com.ibm.db2.luw.apdv.sample.doc/doc/clp/s-tbast-db2.html

我能够创建一个 MQT

当我尝试按照示例创建临时表时,我收到一个错误

例如,

为 XXLIB.SALES 创建 MQT:

create table XXLIB.SALES as 
(select Company, Territory, SUM(Sales) 
From XXLIB.HISTORY Where Company = 1 Group by Company, Territory)
data initially deferred refresh deferred maintained by user

然后是 staging XXLIB.SALES_S

CREATE TABLE XXLIB.SALES_S FOR XXLIB.SALES PROPAGATE IMMEDIATE;

这是错误信息

SQL 状态:42601 供应商代码:-104 消息:[SQL0104] 令牌。不是 有效的。有效令牌: .原因 。 . . . . : 语法错误 在 token .. Token 处检测到。不是有效的令牌。一个部分 有效令牌列表是 .该列表假定 声明是正确的直到令牌。错误可能早于 语句,但该语句的语法似乎是有效的 这点。恢复 。 . . :执行以下一项或多项操作,然后 再次尝试请求: -- 验证区域中的 SQL 语句 令牌..更正该语句。错误可能是缺少逗号或 引号,可能是拼写错误的单词,也可能是相关的 按照从句的顺序。 -- 如果错误标记是 , 更正 SQL 语句,因为它没有以有效的子句结尾。

处理结束,因为突出显示的语句未完成 成功

【问题讨论】:

  • 可能你不小心分享了错误的链接ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/db2/… 那是给SET ENCRYPTION PASSWORD
  • 您是说这与 IBMi 上的 Db2 不同吗? staging table创建逻辑,即CREATE TABLE X_S FOR X PROPAGATE IMMEDIATE;
  • 没错。 only 使用您的服务器平台和版本提供的语法。 使用该服务器平台和版本的匹配文档。是的,更好的 URL 可能是 ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rzajq/… 以及相关的 create table 语句。
  • 谢谢mao,请给一个创建临时表的链接
  • 是什么让您相信您的 i-version 支持 MQT 的该功能?在知识中心中,单击“更改产品版本”以选择与您的服务器匹配的版本,然后在右上角的搜索框中输入您的搜索词。研究您的平台+版本上可用的语法。

标签: sql db2 ibm-midrange db2-400


【解决方案1】:

很遗憾,Db2 for IBM i 并不支持 Db2 for LUW 支持的所有 MQT 功能。

Db2 for i 缺少系统维护的 MQT 以及增量用户维护的 MQT。

您需要使用基表上的触发器在 Db2 for i 上推出您自己的解决方案。

您的触发器可以立即更新 MQT 或写入您自己的“暂存”表。 注意 此表只是在您的刷新过程使用它的意义上暂存。您必须自己手动创建它,就 Db2 for i 而言,它是一个完全独立的表。

就我个人而言,我从不关心 MQT,而是一个带有计算列的编码矢量索引 (EVI) 满足了我所考虑的所有需求。 (请注意,Db2 LUW 没有 EVI)

EVI 由系统维护,因此数据始终是最新的。

CREATE ENCODED VECTOR INDEX sales_fact_location_id_evi 
ON sales_fact(sale_location_id ASC) 
INCLUDE(SUM(sale_amount_measure))

以下 IBM 文档 Accelerated analytics - faster aggregations using the IBM DB2 for i encoded vector index (EVI) technology 讨论了在其他 RDBMS 可能使用 MQT 的情况下使用 EVI。

已添加
这是一个 EVI,它将代替您尝试创建的 MQT...

CREATE ENCODED VECTOR INDEX XXLIB.SALES 
ON XXLIB.HISTORY(Company, Territory)
INCLUDE(SUM(Sales))

EVI 与 MQT 的唯一缺点是您可以在查询中直接引用 MQT,而不是依赖数据库来隐式使用它。使用 EVI,您需要依赖数据库来隐式使用它。

【讨论】:

  • 当然,一个 MQT 只是另一个表......所以像 insert into mymqt select <...> from basetbl where trandate = current_date - 1 day
  • 所以将insert 子选择指向您的临时表而不是您的基表...
  • 我认为查尔斯的观点是你不能按照你想要的方式去做,DB2 for i 不支持它。更好的方法是使用 DB2 for i 独有的 EVI。
  • 可能会考虑一个看起来像您正在考虑的 MQT 的视图。然后,您可以在聚合数据的视图使用的基表上创建 EVI。 Visual Explain 可以告诉您获取的索引是否仅用于对视图的查询。
  • 最好的解决方案恕我直言,一个实际的星型数据仓库(数据集市)的 ETL 过程。正如 IBM 文章所示,EVI 仍然可以发挥重要作用。
猜你喜欢
  • 2015-01-06
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2021-01-30
  • 2011-09-16
相关资源
最近更新 更多