创建实例化视图时,实例化视图的定义必须明确定义列名称;列定义中不能包括 SELECT *
结构。
不要在实例化视图中包含定义为 TIMESTAMP WITH TIME ZONE 的列。由于 time_zone_adjustment 选项在不同位置和年份时间的两个连接之间会不同,因此会生成错误的结果和意外的行为。
创建实例化视图时,其定义中不能包含:
创建实例化视图时,以下数据库选项必须具有指定的设置;否则将返回错误。要使优化程序能够使用该视图,也需要这些数据库选项:
创建实例化视图时,将存储每个视图的以下数据库选项设置。只有连接的当前选项值与为实例化视图存储的值相匹配,该视图才能在优化中使用:
刷新视图时,将忽略上面列出的所有选项的连接设置。改用数据库选项设置(这些设置必须与视图的存储设置匹配)。
实例化视图的行不会以任何特定顺序存储,这一点与基表相似;数据库服务器会在计算数据时以最有效的方式对行进行排序。因此,在实例化视图定义中指定 ORDER BY 子句并不会对视图在实例化后的行顺序产生影响。此外,执行视图匹配时,优化程序也会忽略视图定义中的 ORDER BY 子句。
手动视图更改为快速视图时,会检查以下限制。如果视图违反任何限制,则会返回错误:
可以使用 sa_materialized_view_can_be_immediate 系统过程检查手动视图是否可以转变为快速视图。
视图必须未初始化。
如果视图不包含外连接,则视图必须在不可为空的列上具有唯一索引。如果视图包含外连接,则视图必须在不可为空的列上具有唯一索引,或在可为空的列上具有声明为 WITH NULLS NOT DISTINCT 的唯一索引。
如果视图定义是分组查询,唯一索引列必须与非集合函数的 SELECT LIST 项对应。
视图定义不能包含:
视图定义必须为单一选择项目连接或分组选择项目连接查询块,分组选择项目连接查询块不能包含 HAVING 子句。
分组选择项目连接查询块的 SELECT 列表中必须包含 COUNT(*),并且只允许 SUM 和 COUNT 集合函数。
复杂表达式中不能引用 SELECT 列表中的集合函数。例如,在 SELECT 列表中不允许 SUM( expression ) + 1
。
如果 SELECT 列表包含 SUM(expression)
集合函数且 expression 是不可为空的表达式,则该 SELECT 列表必须包括 COUNT(expression)
集合函数。
如果视图定义包含外连接(LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN),则该视图定义必须满足以下额外条件:
如果在 OUTER JOIN 的 ON 条件中以保留方的形式引用表 T,则表 T 必须拥有一个主键,并且该主键列必须出现在视图的 SELECT 列表中。例如,定义为 SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN (R1 KEY JOIN R2) ON T1.Y = R.Y
的快速实例化视图 V 在 ON 子句引用了保留表 T1,则该保留表的主键列 T1.pk 将位于快速实例化视图 V 的 SELECT 列表中。
对于外连接的每个 NULL 值提供方,必须至少存在一个基表,以便该基表中的某个不可为空的列出现在快速实例化视图的 SELECT 列表中。例如,对于定义为 SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN (R1 KEY JOIN R2) ON T1.Y = R1.Y
的快速实例化视图 V 而言,左外连接的 NULL 值提供方是表表达式 (R1 KEY JOIN R2)
。列 R1.X 位于 V 的 SELECT 列表中;R1.X 是表 R1 的不可为空的列。
如果该视图是一个分组视图且未保存以前的状态,那么对于外连接的每个 NULL 值提供方来说,必须至少存在一个基表 T,以便该基表的某个不可为空的列 T.C 能够在快速实例化视图的 SELECT 列表中的集合函数 COUNT( T.C )
中使用。例如,对于定义为 SELECT T1.pk, COUNT(R1.X) FROM T1, T2 LEFT OUTER JOIN (R1 KEY JOIN R2) ON T1.Y = R1.Y GROUP BY T1.pk
的快速实例化视图 V 而言,左外连接的 NULL 值提供方是表表达式 (R1 KEY JOIN R2)
。集合函数 COUNT( R1.X )
位于 V 的 SELECT 列表中;R1.X 是表 R1 的不可为空的列。
具有外连接的视图的谓语必须满足以下条件:
LEFT、RIGHT 和 FULL OUTER JOIN 的 ON 子句谓语必须同时引用保留表表达式和 NULL 值提供方表表达式。例如,T LEFT OUTER JOIN R ON R.X = 1
不满足此条件,因为谓语 R.X=1 仅引用了 NULL 值提供方 R。
任何谓语都必须拒绝嵌套外连接所生成的提供 NULL 值的行。也就是说,如果谓语引用的表表达式是通过嵌套外连接提供 NULL 值,则必须拒绝所有通过该外连接生成 NULL 值的行。
例如,视图 V1 SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN (R1 KEY JOIN R2) ON (T1.Y = R1.Y) WHERE R1.Z = 10
的谓语 R1.Z=10
引用了可以通过 T2 LEFT OUTER JOIN (R1 KEY JOIN R2)
提供 NULL 值的表 R1,因而该谓语必须拒绝任何提供 NULL 值的行。事实确实如此,因为当列 R1.Z 为 NULL 时该谓语的求值结果为 UNKNOWN。
但是,视图 V2 SELECT T1.pk, R1.X FROM T1, T2 LEFT OUTER JOIN (R1 KEY JOIN R2) ON (T1.Y = R1.Y) WHERE R1.Z IS NULL
不具有该属性。谓语 R1.Z IS NULL
引用 NULL 值提供方 R1,不过表 R1 提供 NULL 值时(即,R1.Z 列为空),该谓语的求值结果为 TRUE。拒绝提供 NULL 值的行的方法比不允许 NULL 值的属性限制要少。例如,谓语 R.X IS NOT DISTINCT FROM T.X and rowid(T) IS NOT NULL
允许针对表 T 提供空值,因为当 T.X 为 NULL 时,该谓语的求值结果为 TRUE。不过,该谓语会拒绝所有为基表 T 提供 NULL 值的行。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |