创建实例化视图时,实例化视图的定义必须显式定义列名称;列定义中不能包括 SELECT *
结构。
不要在实例化视图中包含定义为 TIMESTAMP WITH TIME ZONE 的列。由于 time_zone_adjustment 选项在不同位置和年份时间的两个连接之间会不同,因此会生成错误的结果和意外的行为。
创建实例化视图时,其定义中不能包含:
分组选择项目连接查询块的选择列表中必须包含 COUNT(*),并且只允许与 SUM 和 COUNT 集合函数结合使用。
创建实例化视图时,以下数据库选项必须具有指定的设置;否则将返回错误。要使优化程序能够使用该视图,也需要这些数据库选项:
创建实例化视图时,将存储每个视图的以下数据库选项设置。只有连接的当前选项值与为实例化视图存储的值相匹配,该视图才能在优化中使用:
刷新视图时,将忽略上面列出的所有选项的连接设置。改用数据库选项设置(这些设置必须与视图的存储设置匹配)。
实例化视图的行不会以任何特定顺序存储,这一点与基表相似;数据库服务器会在计算数据时以最有效的方式对行进行排序。因此,在实例化视图定义中指定 ORDER BY 子句并不会对视图在实例化后的行顺序产生影响。此外,执行视图匹配时,优化程序也会忽略视图定义中的 ORDER BY 子句。
手动视图更改为快速视图时,会检查以下限制。如果视图违反任何限制,则会返回错误:
可以使用 sa_materialized_view_can_be_immediate 系统过程检查手动视图是否可以转变为快速视图。
视图必须未初始化。
如果视图不包含外连接,则视图必须在不可为空的列上具有唯一索引。如果视图包含外连接,则视图必须在不可为空的列上具有唯一索引,或在可为空的列上具有声明为 WITH NULLS NOT DISTINCT 的唯一索引。
如果视图定义是分组查询,唯一索引列必须与非集合函数的 SELECT 列表项对应。
视图定义不能包含:
视图定义必须为单一选择项目连接或分组选择项目连接查询块,分组选择项目连接查询块不能包含 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 提供 NULL 值,因为当 T.X 为 NULL 时,该谓语的求值结果为 TRUE。不过,该谓语会拒绝所有为基表 T 提供 NULL 值的行。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |