发生计算了 
当然没有 select 字段1,字段2,字段3 from 表快了 如果在索引列上进行计算 那就用不到索引了

解决方案 »

  1.   

    如果不在WHERE,JOIN里,这种影响可以忽略.
      

  2.   

    计算列由可以使用同一表中的其他列的表达式计算得来。该表达式可以是非计算列的列名、常量、函数、变量,也可以是用一个或多个运算符连接的这些元素的任意组合。表达式不能为子查询。 除非另行指定,否则计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将重新计算它们的值。SQL Server 2005 Database Engine 在 CREATE TABLE 和 ALTER TABLE 语句中使用 PERSISTED 关键字来将计算列实际存储在表中。如果在计算列的计算更改时涉及任何列,将更新计算列的值。通过将计算列标记为 PERSISTED,可以对具有确定性但不精确的计算列创建索引。另外,如果计算列引用 CLR 函数,则数据库引擎 不能验证该函数是否真正具有确定性。在这种情况下,计算列必须为 PERSISTED,以便可对其创建索引计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何可使用正则表达式的其他位置,但下列情况除外: 用作 CHECK、FOREIGN KEY 或 NOT NULL 约束的计算列必须标记为 PERSISTED。如果计算列的值由具有确定性的表达式定义,并且索引列中允许使用计算结果的数据类型,则可将该列用作索引中的键列,或者用作 PRIMARY KEY 或 UNIQUE 约束的一部分。 例如,如果表中含有整数列 a 和 b,则可以对计算列 a + b 创建索引,但不能对计算列 a + DATEPART(dd, GETDATE()) 创建索引,因为在后续调用中,其值可能发生改变。 
    计算列不能作为 INSERT 或 UPDATE 语句的目标。 
    数据库引擎 基于使用的表达式自动确定计算列的为空性。即使只有非空列,大多数表达式的结果也“认为”可为空值,因为下溢或溢出生成的结果也可能为空。使用带 AllowsNull 属性的 COLUMNPROPERTY 函数可查明表中任何计算列的为空性。可以将可为空值的表达式转换为非空表达式,方法是指定 ISNULL(check_expression, constant),其中,constant 是替换任意空结果的非空值。