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 系列物化视图刷新的主要内容,如果未能解决你的问题,请参考以下文章