【问题标题】:DB2 iseries materialized view refreshDB2 系列物化视图刷新
【发布时间】: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

标签: db2 db2-400


【解决方案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它)

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 2014-07-11
    • 2017-11-13
    • 1970-01-01
    • 2017-06-07
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    相关资源
    最近更新 更多