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。
本文结语:
须要频繁访问的计算列能够考虑持久化。当计算列为肯定性且精确,或肯定性、不精确、持久化时,能够建立索引。