关于给表添加计算列所带来的性能提升

最近发现项目中的SQL的WHERE部分有很多的计算列,例如:

USE AdventureWorks2014
SELECT 1 FROM dbo.Person WHERE FirstName+‘ ‘+LastName=‘Diane Margheim‘

所以针对这个部分进行下优化,所以打算采用计算列的方式,但是又没有证明到底可不可行,所以发表下该文章发表下自己的理解也希望各位大神能点出不足的地方.

以下是针对计算列性能优化的证明:

先填充数据

USE AdventureWorks2014
GO

SELECT * INTO dbo.person FROM Person.Person
GO

第一种情况,无计算列情况

SET STATISTICS IO ON
SET STATISTICS TIME ON
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
GO
SELECT 1 FROM dbo.Person WHERE FirstName+‘ ‘+LastName=‘Diane Margheim‘
GO

第二种情况,添加计算列

ALTER TABLE dbo.Person ADD fullName AS (FirstName +‘ ‘+ LastName)
SET STATISTICS IO ON
SET STATISTICS TIME ON
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
GO
SELECT 1 FROM dbo.Person WHERE FirstName+‘ ‘+LastName=‘Diane Margheim‘
GO

再次查询

SET STATISTICS IO ON
SET STATISTICS TIME ON
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
GO
SELECT 1 FROM dbo.Person WHERE FirstName+‘ ‘+LastName=‘Diane Margheim‘
GO

从信息和查询计划可得知,添加计算列以后不会带来性能上的提升

第三种情况,给计算列设置为持久,再次尝试

ALTER TABLE dbo.Person ADD fullName AS (FirstName +‘ ‘+ LastName) PERSISTED
SET STATISTICS IO ON
SET STATISTICS TIME ON
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
GO
SELECT 1 FROM dbo.Person WHERE FirstName+‘ ‘+LastName=‘Diane Margheim‘
GO

将计算列设置可持久化以后效能会有一个提升(预读15次)

第四种情况,不持久化的情况下给计算列添加索引

CREATE INDEX ix_index_fullName ON dbo.Person(fullName)
SET STATISTICS IO ON
SET STATISTICS TIME ON
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
GO
SELECT 1 FROM dbo.Person WHERE FirstName+‘ ‘+LastName=‘Diane Margheim‘
GO

从讯息可得知,添加了索引以后,查询提高一个数量级,

第五种情况,持久化的情况下给计算列添加索引

已经对性能提高微乎其微了。

所以针对以上五种情况可得知:

计算列(持久化或者不持久化)添加索引以后可以对SQL性能有所提高。

PS:持久化会增大本地的物理存储空间

以上是我对计算列性能提高所带来的证明,如果有不足,还请指点,谢谢:)

时间: 2024-12-17 05:47:57

关于给表添加计算列所带来的性能提升的相关文章

oracle 表添加一列

语法:alter table 表名 add 列名 列格式 [null/not null] 例子: alter table t_test_lll add createdate Date null; 注意:添加非空列时,要保证表中没有数据.

memcache 与 redis 为web app 带来的性能提升

参考: 1. http://www.cnblogs.com/ToDoToTry/p/3513688.html

网格部件添加表达式计算列使用介绍

度量快速开发平台的网格部件中,可以在界面上添加虚拟的计算列,假设一个业务中有 单价,有数量字段,但是没用总价这个字段,则可以在界面上通过添加表达式计算列加上. 添加表达式计算列,可以根据不同的业务需求添加计算列. 语法: 网格部件名称.AddExpressionColumn("columnName","[基本工资]*0.2",2) 添加表达式计算列,第一个参数为列名,第二个参数为计算列表达式.第三个参数为列类型:1:整数,2:数字,3:时间,4:字符串,5:布尔,6

SQL Server-聚焦计算列持久化(二十一)

前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always to review the basics. 初探计算列持久化(Compued Column Persisted) 在SQL Server 2005就引入了计算列,我们首先稍微看下在msdn关于计算列的定义:计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以

在计算列中创建索引提高性能

前言:在理解计算列上的索引之前,先了解计算列的基本知识.计算列由可以使用同一表中的其他列的表达式计算得来.表达式可以是非计算列的列名.常量.函数,也可以是用一个或多个运算符连接的上述元素的任意组合.表达式不能为子查询.默认情况下,计算列是一个虚拟的列,并且可以在调用时重新计算,直到在CREATE TABLE或者ALTER TABLE 命令中使用PERSISTED.如果列定义成PERSISTED,会存放计算值,并存放在原始列上更新后的汇总值,不能对计算列进行INSERT.UPDATE. 准备工作:

SQL Server ->> Computed Column(计算列)

Computed Column(计算列)是自SQL Server 2005开始就有的特性.计算列的定义是一个表达式.表达式可以是非计算列,常量,函数间的组合.但是不可以是子查询. 计算列数据固化 默认情况下计算列的数据是存储在磁盘上,仅当计算列被查询引用是才进行实时计算.只在计算列在定义是添加了PERSISTED关键词是才将数据固化. 计算列上创建索引或者作为分区函数的引用列 计算列上是运行创建索引和作为分区函数的引用列.但是必须指定PERSISTED关键词. 用法其实很简单.那么这里有些问题.

计算列建立索引

计算列上的索引 只要满足下列要求就可以为计算列定义索引: 1.所有权要求 2.确定性要求 3.精度要求 4.数据类型要求 5.SET 选项要求 所有权要求 计算列中的所有函数引用必须与表具有相同的所有者. 测试环境(MSSQL 2012): --自定义所有者为guest的标量函数GetMonth CREATE FUNCTION guest.GetMonth(@1 datetime) returns nvarchar(10) as begin DECLARE @return nvarchar(10

SQL Server-聚焦计算列或计算列持久化查询性能(二十二)

前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非持久化计算列性能要好 我们开始创建两个一样的表并都插入100条数据来进行比较,对于计算列我们重新进行创建计算列和非计算列持久化. CREATE TABLE [dbo].[ComputeColumnCompare] (ID INT, FirstName VARCHAR(100), LastName C

向SQL Server 现有表中添加新列并添加描述.

注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) 代码 /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' *********