Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

REFRESH MATERIALIZED VIEW 语句

通过执行查询定义来初始化或刷新实例化视图中的数据。

语法
REFRESH MATERIALIZED VIEW view-list
 [ WITH { 
      ISOLATION LEVEL isolation-level
      | { EXCLUSIVE | SHARE } MODE } ]
 [ FORCE BUILD ] 
view-list :
[ owner.]materialized-view-name [, ... ]
isolation-level : 
READ UNCOMMITTED 
| READ COMMITTED 
| SERIALIZABLE 
| REPEATABLE READ 
| SNAPSHOT
参数
  • WITH 子句   WITH 子句用于指定刷新过程中在基础性基表上使用的锁定类型。锁定类型决定如何填充实例化视图以及如何影响事务的并发性。WITH 语句设置不影响实例化视图本身的锁定类型,它始终为独占锁。可指定的锁定子句为:

    • ISOLATION LEVEL isolation-level   WITH ISOLATION LEVEL 用于更改执行刷新操作的隔离级别。语句执行结束时会恢复该连接的原始隔离级别。

      对于快速视图,isolation-level 只能是 SERIALIZABLE。

      对于快照隔离,只支持快照级别(指定 SNAPSHOT);不支持语句级和只读语句快照。

      有关隔离级别的信息,请参见使用事务和隔离级别隔离级别和一致性

    • EXCLUSIVE MODE   如果不想更改隔离级别,但希望保证更新后的数据与基础表中已提交数据保持一致,则使用 WITH EXCLUSIVE MODE。使用 WITH EXCLUSIVE MODE 时,会在所有基础基表上放置独占表锁,在刷新操作完成前,其它事务无法对基础表执行查询、更新或其它任何操作。如果无法获取独占表锁,则刷新操作失败并返回错误。请参见表锁

    • SHARE MODE   WITH SHARE MODE 用于在执行刷新操作时为其它事务赋予对基础表的读权限。指定此子句后,在执行刷新操作之前,所有基础性基表都获得了共享表锁,并持续到刷新操作完成。请参见表锁

  • FORCE BUILD 子句   缺省情况下,执行 REFRESH MATERIALIZED VIEW 语句时,数据库服务器会检查实例化视图是否失效(即自上次刷新实例化视图后基础表已发生更改)。如果未失效,则不进行刷新。指定 FORCE BUILD 子句以强制刷新实例化视图,而无论实例化视图是否已失效。

注释

此语句用于初始化或刷新 view-list 中列出的实例化视图。

如果对未失效的实例化视图执行 REFRESH MATERIALIZED VIEW 语句,则除非指定了 FORCE BUILD 子句,否则不会执行刷新操作。

锁定和数据并发的缺省刷新行为如下:

  • 如果视图是快速视图,则无论是否启用快照隔离,缺省刷新行为都是 WITH SHARE MODE。

  • 如果视图是手动视图,且正在使用 快照隔离,则缺省为 WITH ISOLATION LEVEL SNAPSHOT。

  • 如果视图是手动视图,但未使用 快照隔离,则缺省为 WITH SHARE MODE。

有关隔离级别和启用快照隔离的详细信息,请参见隔离级别和一致性allow_snapshot_isolation 选项 [数据库]

为了 REFRESH MATERIALIZED VIEW 能够成功执行以及能够在优化中使用视图,某些选项需要具有特定的值。另外,创建每个实例化视图时都为其存储了相应的选项设置。要刷新视图,或在优化中使用视图,这些选项设置必须与当前选项相匹配。请参见实例化视图的限制

如果在执行完部分工作后刷新失败,则视图会处于未初始化状态,并且数据无法恢复到刷新开始前的状态。请检查刷新失败时出现的错误,解决导致失败的问题,然后再次执行 REFRESH MATERIALIZED VIEW 语句。

还可以使用 ALTER MATERIALIZED VIEW 语句的 IMMEDIATE REFRESH 子句,以将视图更改为在基础数据发生更改时立即刷新。请参见ALTER MATERIALIZED VIEW 语句

当存在使用 WITH HOLD 子句打开的使用语句快照或事务快照的游标时,不能执行此语句。请参见快照隔离

权限

必须具有实例化视图的 INSERT 权限,以及实例化视图定义中的表的 SELECT 权限。

副作用

关闭任何引用实例化视图的打开游标。

在执行开始时执行检查点操作。

在执行开始和结束时执行自动提交。

在执行时,使用连接 blocking 选项在正在刷新的实例化视图上放置独占模式锁,并在实例化视图所引用的所有表上放置共享模式锁(不阻塞)。如果指定了 WITH 子句,可以在基础表上获得更多锁。此外,在刷新完成之前,实例化视图会一直处于未初始化状态,从而使得数据库服务器或优化程序无法使用它。

另请参见
标准和兼容性
  • SQL/2003   服务商扩充。

示例

假设您将创建一个实例化视图 EmployeeConfid99,然后使用以下语句向该实例化视图填充数据:

CREATE MATERIALIZED VIEW EmployeeConfid99 AS
   SELECT EmployeeID, Employees.DepartmentID, SocialSecurityNumber, Salary, ManagerID,
      Departments.DepartmentName, Departments.DepartmentHeadID
   FROM Employees, Departments
   WHERE Employees.DepartmentID=Departments.DepartmentID;
REFRESH MATERIALIZED VIEW EmployeeConfid99;

随后,在该视图已投入使用后,您想要使用 READ COMMITTED 隔离级别(隔离级别 1)来刷新该视图并想重建该视图。可以执行以下语句:

REFRESH MATERIALIZED VIEW EmployeeConfid99
   WITH ISOLATION LEVEL READ COMMITTED
   FORCE BUILD;
小心

处理该示例时,应删除所创建的实例化视图。否则,在试验其它示例时,将无法对其基础表 Employees 和 Departments 执行模式更改。无法变更具有已启用相关实例化视图的表的模式。请参见删除实例化视图