DB2 系列物化视图刷新

Posted

技术标签:

【中文标题】DB2 系列物化视图刷新【英文标题】:DB2 iseries materialized view refresh 【发布时间】:2019-02-08 14:45:15 【问题描述】:

我已经创建了如下的物化查询表:

CREATE TABLE SCHEMA.TABLE AS
  (SELECT * FROM SCHEMA.TABLEEXAMPLE)
     DATA INITIALLY DEFERRED
     REFRESH DEFERRED
     MAINTAINED BY USER
     DISABLE QUERY OPTIMIZATION;

当我执行REFRESH TABLE SCHEMA.TABLE 时,它会被锁定以供其他用户读取。

从 IBM https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000977.html阅读此文档

我试图执行这个语句:

REFRESH TABLE SCHEMA.TABLE ALLOW READ ACCESS

但我收到以下错误:SQL State: 42601 Unexpected keyword ALLOW

我在声明中遗漏了什么?是否有其他方法允许在更新具体化查询表时对其进行读取访问?

【问题讨论】:

如果 Db2-server 在 i 系列上运行,请不要引用 Db2-server 的 Linux/Unix/Windows 页面。不同的操作系统,不同的 Db2 风格。 i-series Refresh Table 的正确页面是ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/db2/…,正如您所见,它不支持该子句。可以在 mqt 的 SELECT 上指定一个较小的隔离子句。 谢谢毛。你知道如何指定隔离级别吗?我尝试在 select 语句末尾使用 WITH UR 选项:SELECT * FROM SCHEMA.TABLE WITH UR 但我收到错误 SQL State: 57033, file is in use 考虑在 Db2 for i 知识中心搜索 isolation level 【参考方案1】:

Db2 for IBM i 上的 MQT 落后于 Db2 for LUW 中可用的功能。

我从不理会它们,而是带有计算列的编码矢量索引 (EVI) 满足了我所考虑的所有需求。 (请注意,Db2 LUW 没有 EVI)

根据毛的评论,您可以尝试使用以下内容删除重新创建 MQT:

CREATE TABLE SCHEMA.TABLE AS
  (SELECT * FROM SCHEMA.TABLEEXAMPLE)
     DATA INITIALLY DEFERRED
     REFRESH DEFERRED
     MAINTAINED BY USER
     DISABLE QUERY OPTIMIZATION
     with NC;

但我认为刷新仍需要独占访问 MQT。

我能想到的在使用 MQT 时“刷新”它的唯一选项

以编程方式,使用基表上的触发器或使用 SQL 一次更新几行的进程。

删除 DISABLE QUERY OPTIMIZATION 并且不直接访问 MQT。而是依赖优化器在适当的时候访问它。现在您可以每隔几个小时创建一个版本,并且 Db 应该开始使用新版本进行新查询。一旦不再使用旧的,您就将其删除(或REFRESH它)

【讨论】:

以上是关于DB2 系列物化视图刷新的主要内容,如果未能解决你的问题,请参考以下文章

物化视图 - 识别最后一次刷新

oracle物化视图不会自动更新是怎么回事

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

Oracle设置物化视图的自动刷新

PostgreSQL物化视图刷新“堆叠”

[转]物化视图创建 及 刷新机制修改