4、物理优化(3)计算列及其索引

1、计算列web

一、概念正则表达式

  计算列由可使用同一表中的其余列的表达式计算得来。表达式能够是非计算列的列名、常量、函数,也能够是用一个或多个运算符链接的上述元素的任意组合。表达式不能为子查询。数据库

  通常在写SQL的时候应该避免在条件中使用函数,由于这样就不能有效的使用索引,从而没法生成高效的执行计划。SQL Server提供了计算列能够帮助咱们解决这个问题。 express

  例如,某查询对大小写敏感,但愿查询某列所有转为小写,若是程序设计时没有考虑到,那么须要在查询的时候就必需要强制转化。 select * from table1 where lower(column1) = 'abc'ide

 

  计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何可以使用正则表达式的其余位置,但下列状况除外:函数

(1)用做 CHECK、FOREIGN KEY 或 NOT NULL 约束的计算列必须标记为 PERSISTED。若是计算列的值由具备肯定性的表达式定义,而且索引列中容许使用计算结果的数据类型,则可将该列用做索引中的键列,或者用做 PRIMARY KEY 或 UNIQUE 约束的一部分。优化

(2)计算列不能做为 INSERT 或 UPDATE 语句的目标。spa

 

  数据库引擎基于使用的表达式自动肯定计算列的为 Null 性。即便只有非空列,大多数表达式的结果也“认为”可为空值,由于下溢或溢出生成的结果也可能为空。经过指定 ISNULL (check_expression,constant) 能够将可为空值的表达式转换为不可为空值的表达式,其中, constant 是可替换全部空结果的非空值. 设计

 

二、建立计算列orm

 

CREATE TABLE t2 (a int, b int, c int, x float, 
   y AS CASE x 
         WHEN 0 THEN a 
         WHEN 1 THEN b 
         ELSE c 
      END)

 

 

三、建立持久化计算列

  若是不使用PERSISTED 关键字,计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将从新计算它们的值。

  使用PERSISTED 关键字计算列实际存储在表中。若是在计算列的计算更改时涉及任何列,将更新计算列的值。 

 

 

2、为计算列建立索引的限制条件

1. 全部权

  计算列中的全部函数引用必须与表具备相同的全部者。

 

2. 肯定性

  若是对于一组指定的输入表达式始终返回相同的结果,则说明表达式具备肯定性。

  computed_column_expression 必须具备肯定性。若是下列一项或多项为真,则 computed_column_expression 具备肯定性:

(1)表达式引用的全部函数都具备肯定性,而且是精确的。这些函数包括用户定义函数和内置函数。若是计算列是 PERSISTED,则函数可能不精确。

(2)表达式引用的全部列都来自包含计算列的表。

(3)没有列引用从多行中请求数据。例如,聚合函数(如 SUM 或 AVG)依靠来自多行的数据,这使 computed_column_expression 具备不肯定性。

(4)没有系统数据访问或用户数据访问。

 

  任何包含公共语言运行时 (CLR) 表达式的计算列都必须具备肯定性并标记为 PERSISTED,这样才能为该列建立索引。容许在计算列定义中使用 CLR 用户定义类型的表达式。类型为 CLR 用户定义类型的计算列只要其类型是可比较的,就能够在该列上建立索引。

 

3. 精度

  computed_column_expression 必须精确。若是下列一项或多项为真,则 computed_column_expression 是精确的:

(1)表达式的数据类型不是 float 或 real。

(2)表达式定义中没有使用 float 或 real 数据类型。

 

  任何 float 或 real 表达式都被认为是不精确的,不能做为索引键;float 或 real 表达式能够在索引视图中使用,但不能做为键使用。对于计算列一样如此。若是任何函数、表达式或用户定义函数包含任何 float 或 real 表达式,则被认为是不精确的。这也包括逻辑表达式(比较)。

  若是计算列使用肯定性但不精确的表达式定义,但在 CREATE TABLE 或 ALTER TABLE 语句中标记为 PERSISTED,则能够在该列上建立索引。这意味着数据库引擎在表中存储计算值,而且在计算列所依赖的任何其余列发生更新时更新这些值。若是数据库引擎对列建立了索引而且该索引由某查询引用,则会使用这些持久值。当数据库引擎不能准确证实返回计算列表达式的函数(特别是在 .NET Framework 中建立的 CLR 函数)是否既具备肯定性又精确时,使用此选项能够对计算列建立索引。

 

4. 数据类型

  数据类型要求以下:

(1)为计算列定义的 computed_column_expression 的值不能为 text、ntext 或 p_w_picpath 数据类型。

(2)只要计算列的数据类型能够做为索引键列,从 p_w_picpath、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 和 xml 数据类型派生的计算列上就能够建立索引。

(3)只要计算列的数据类型能够做为非键索引列,从 p_w_picpath、ntext 和 text 数据类型派生的计算列就能够做为非汇集索引中的非键(包含性)列。

 

5. SET选项

  SET 选项要求以下:

(1)执行定义计算列的 CREATE TABLE 或 ALTER TABLE 语句时,必须将 ANSI_NULLS 链接级选项设置为 ON。

(2)对于在其中建立索引的链接和全部尝试执行 INSERT、UPDATE 或 DELETE 语句(将更改索引中的值)的链接,必须将六个 SET 选项(ANSI_NULLS、ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER)设置为 ON,将一个选项(NUMERIC_ROUNDABORT)设置为 OFF。若是不具备上述选项设置的链接执行了任何 SELECT 语句,优化器将忽略计算列的索引。

(3)当数据库兼容级别设置为 90 时,若是 ANSI_WARNINGS 设置为 ON,则会将 ARITHABORT 隐式设置为 ON。若是数据库兼容级别设置为 80 或更低,则必须将 ARITHABORT 选项显式设置为 ON。

 

 

本文结语:

  须要频繁访问的计算列能够考虑持久化。当计算列为肯定性且精确,或肯定性、不精确、持久化时,能够建立索引。

相关文章
相关标签/搜索