【问题提问、论坛交流】
从 SQL Server 所执行的自动维护注意事项的角度来看,显示预计的执行计划功能可能会让用户在一定程度上了解这一开销的影响。如果通过 SQL Server Management Studio 评估修改视图的语句(视图上的 UPDATE、基表中的 INSERT),对该语句显示的执行计划将包括该语句的维护操作。如果就该操作在生产环境中所要执行的次数考虑该成本,那么可能会产生视图维护成本。
通常建议尽可能对视图或其底下的基表成批(而非单独)执行任何修改或更新操作。这样就会降低视图维护开销。
五、创建索引视图
创建索引视图所需的步骤对于视图的成功执行至关重要。
|
1. |
针对将在视图中引用的所有现有表,确认 ANSI_NULLS 的设置正确无误。 |
|
2. |
创建任何新表之前,确认对下表所示的当前会话正确设置了 ANSI_NULLS。 |
|
3. |
创建任何新表之前,确认对下表所示的当前会话正确设置了 ANSI_NULLS 和 QUOTED_IDENTIFIER。 |
|
4. |
确认视图定义具有确定性。 |
|
5. |
使用 WITH SCHEMABINDING 选项创建视图。 |
|
6. |
在视图上创建唯一的聚集索引之前,确认会话的 SET 选项的设置正确无误,如下图所示。 |
|
7. |
在视图上创建唯一的聚集索引。 |
|
8. |
可用 OBJECTPROPERTY 函数检查现有表或视图上 ANSI_NULLS 和 QUOTED_IDENTIFIER 的值。 |
使用 SET 选项获得一致的结果
如果在执行查询时对当前会话启用了不同的 SET 选项,评估相同的表达式可在 SQL Server 2005 中产生不同的结果。例如,SET 选项 CONCAT_NULL_YIELDS_NULL 被设为 ON 后,表达式 'abc' + NULL 会返回值 NULL。但当 CONCAT_NULL_YIEDS_NULL 被设为 OFF 后,相同的表达式会生成 'abc'。对于当前会话和视图所引用的对象,索引视图需要几个 SET 选项的固定值,以确保正确维护视图并返回一致的结果。
只要存在下列条件,就必须按下表中“必需的值”一列所示的值对当前会话设置 SET 选项:
| • |
创建了索引视图。 |
| • |
在加入索引视图的任何表上执行了任何 INSERT、UPDATE 或 DELETE 操作。 |
| • |
查询优化器用索引视图生成查询计划。
|
ANSI_NULLS |
ON |
OFF |
ON |
OFF |
|
ANSI_PADDING |
ON |
ON |
ON |
OFF |
|
ANSI_WARNINGS |
ON |
OFF |
ON |
OFF |
|
CONCAT_NULL_YIELDS_NULL |
ON |
OFF |
ON |
OFF |
|
NUMERIC_ROUNDABORT |
OFF |
OFF |
OFF |
OFF |
|
QUOTED_IDENTIFIER |
ON |
OFF |
ON |
OFF |
|
ARITHABORT4 选项必需被设为 ON,以便使当前会话创建索引视图,但是在 SQL Server 2005 中,只要 ANSI_WARNINGS 的值为 ON,该选项就会自动被设为 ON,所以不必对其进行设置。如果使用 OLE DB 或 ODBC 服务器连接,只需修改 ARITHABORT 设置的值。必须使用 sp_configure 在服务器级别或使用 SET 命令从应用程序正确设置所有 DB LIB 值。有关 SET 选项的详细信息,参阅 SQL Server 联机丛书中的“使用选项”。
使用具有确定性的功能
索引视图的定义必须具有确定性。如果选择列表中的所有表达式以及 WHERE 和 GROUP BY 子句都具有确定性,那么视图就具有确定性。具有确定性的表达式总是在通过一组特定的输入值对其进行评估时,返回相同的结果。只有具有确定性的函数才会加入具有确定性的表达式。例如,DATEADD 函数具有确定性,因为对于任何给定的一组参数值,该函数总对它的三个参数返回相同的结果。GETDATE 不具有确定性,因为它总调用相同的参数,而其返回的值在每次执行时都会发生变化。详细信息,参阅面向 SQL Server 2005 的 SQL Server 联机丛书中的“具有和不具有确定性的函数”。
编辑:xker.com