REFRESH TABLE 语句
REFRESH TABLE 语句刷新具体化查询表中的数据。
调用
此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是可动态准备的可执行语句。
授权
语句授权标识所拥有的特权必须至少包括下列其中一项权限:
- 对表的 CONTROL 特权
- 包含具体化查询表的模式上的 DATAACCESS 权限
- DATAACCESS 权限
语法
描述
- table-name
- 标识要刷新的表。名称 (包括隐式或显式模式) 必须标识当前服务器上已存在的表。 该表必须允许 REFRESH TABLE 语句 (SQLSTATE 42809)。 这包括使用以下内容定义的具体化查询表:
- 立即刷新
- REFRESH DEFERRED
联机选项 - 指定正被处理的表的可访问性。
- ALLOW NO ACCESS
- 指定在刷新表时,任何其他用户都不能访问该表,除非他们正在使用 "未落实的读" 隔离级别。
- ALLOW READ ACCESS
- 指定其他用户在刷新表时对该表具有只读访问权。
- ALLOW WRITE ACCESS
- 指定其他用户在刷新表时对该表具有读写访问权。
查询优化选项 - 指定刷新 REFRESH DEFERRED 具体化查询表的查询优化选项。
- ALLOW QUERY OPTIMIZATION USING REFRESH DEFERRED TABLES WITH REFRESH AGE ANY
- 指定当 CURRENT REFRESH AGE 专用寄存器设置为 "ANY" 时, table-name 的刷新将允许 REFRESH DEFERRED 具体化查询表用于优化用于刷新 table-name的查询。 如果 table-name 不是 REFRESH DEFERRED 具体化查询表,那么将返回错误(SQLSTATE 428FH)。 始终考虑 REFRESH IMMEDIATE 具体化查询表以进行查询优化。
- INCREMENTAL
- 通过仅考虑其底层表的 delta 部分 (如果有) 或关联登台表的内容 (如果存在且其内容一致) ,指定该表的增量刷新。 如果无法满足此类请求 (即,系统检测到需要完全重新计算具体化查询表定义) ,那么将返回错误 (SQLSTATE 55019)。
- NOT INCREMENTAL
- 通过重新计算具体化查询表定义来指定表的完全刷新。
如果既未指定 INCREMENTAL 也未指定 NOT INCREMENTAL ,那么系统将确定是否可以进行增量处理; 否则,将执行完全刷新。 如果要刷新的具体化查询表存在登台表,并且由于登台表处于暂挂状态而无法进行增量处理,那么将返回错误 (SQLSTATE 428A8)。 如果登台表或具体化查询表处于不一致状态,那么将执行完全刷新; 否则,登台表的内容将用于增量处理。
规则
- 如果对引用一个或多个昵称的具体化查询表发出 REFRESH TABLE ,那么语句的授权标识必须有权从数据源处的表或数据源处的表的所有模式中进行选择 (SQLSTATE 42501)。
- 如果在系统维护的按列组织的 MQT 上发出 REFRESH TABLE ,那么必须使用 NOT INCREMENTAL 子句。
注意
- 当该语句用于刷新其底层表已装入,连接或拆离的 REFRESH IMMEDIATE 具体化查询表时,系统可能会选择使用其底层表的增量部分以增量方式刷新具体化查询表。 当该语句用于刷新具有支持登台表的 REFRESH DEFERRED 具体化查询表时,系统可能会选择以增量方式刷新具体化查询表及其已在登台表中捕获的底层表的增量部分。 但是,在某些情况下不可能进行此优化,需要进行完全刷新 (即,重新计算具体化查询表定义) 以确保数据完整性。 您可以通过指定 INCREMENTAL 选项来显式请求增量维护; 如果无法进行此优化,那么系统将返回错误 (SQLSTATE 55019)。
- 如果使用了 ALLOW QUERY OPTIMIZATION USING REFRESH DEFERRED TABLES WITH REFRESH AGE ANY 选项,请确保刷新顺序对于 REFRESH DEFERRED 具体化查询表是正确的。 例如,考虑两个具体化查询表(MQT1 和 MQT2),这两个具体化查询共享相同的底层表。 可使用 MQT1 取代基础表来计算 MQT2 的具体化查询。 如果使用单独的语句来刷新这两个具体化查询表,并且先刷新 MQT2 ,那么系统可能会选择使用尚未刷新的 MQT1的内容来刷新 MQT2。 在这种情况下, MQT1 将包含当前数据,但 MQT2 仍可能包含旧数据,即使两者几乎同时刷新也是如此。 如果使用了两个 REFRESH 语句而不是一个,那么正确的刷新顺序是先刷新 MQT1 。
- 如果具体化查询表具有关联的登台表,那么在成功执行刷新时将修剪登台表。
- 基本表或具体化查询表上的任何基于标签的访问控制都不会干扰刷新过程。 将执行刷新,就像不存在基于标签的访问控制一样。 创建时与具体化查询表关联的自动保护可确保基本表中的数据在传递到具体化查询表时仍受保护。
- 仅对于具体化查询表, SET INTEGRITY FOR mqt_name IMMEDIATE CHECKED 与 REFRESH TABLE mqt_name相同。
- 刷新使用具体化查询表: 在处理 REFRESH TABLE 语句期间,不使用具体化查询表来评估 select-statement 。
- 刷新隔离级别: 用于对 select-statement 求值的隔离级别是在 select-statement的 isolation-level 子句上指定的隔离级别。 或者,如果未指定 isolation-level 子句,那么发出 CREATE TABLE 或 ALTER TABLE 时记录的具体化查询表的隔离级别将用于对 select-statement求值。
- 考虑语句:
在以下场景中,既不支持对 T 使用 INCREMENTAL 检查选项,也不支持 T 的增量刷新(如果 T 是具体化查询表 (MQT) 或登台表):SET INTEGRITY FOR T IMMEDIATE CHECKED- 当 T 处于“设置完整性暂挂”状态时,已对 T 添加新约束。
- 如果对 T、其父表或其底层表执行了 LOAD REPLACE 操作
- 如果最近对 T、其父表或其基础表执行完整性检查后,激活了 NOT LOGGED INITIALLY WITH EMPTY TABLE 选项
- 以非增量方式检查 T 的任何父表或 T 的基础表(如果 T 是具体化查询表或登台表)的完整性后对完全处理进行了级联
- 如果已将包含表或其父表(或者具体化查询表或登台表的基础表)的表空间前滚到某一时间点,而表及其父表或基础表(如果表是具体化查询表或登台表)位于不同表空间中
- T 是 MQT,上次刷新后直接对 T 执行了 LOAD REPLACE 或 LOAD INSERT 操作
- 只要情况允许,就将使用增量处理,这是因为增量处理更有效。 大多数情况下,不需要 INCREMENTAL 选项。 但是,需要此选项以确保以增量方式处理完整性检查。 如果系统检测到需要执行完全处理以确保数据完整性,那么会返回错误 (SQLSTATE 55019)。
- 如果未满足先前项目符号中描述的完全处理条件,那么当用户未对语句
SET INTEGRITY FOR T IMMEDIATE CHECKED指定 NOT INCREMENTAL 选项时,系统将执行增量刷新 (如果它是具体化查询表)。
