前言
上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always to review the basics。
初探计算列持久化(Compued Column Persisted)
在SQL Server 2005就引入了计算列,我们首先稍微看下在msdn关于计算列的定义:计算列由可以使用同一表中的其他列的表达式计算得来。表达式可以是非计算列的列名、常量、函数,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。实际上就是为了定义一个列来对其他列来进行计算可以是列名、函数等,那么它的使用场景是什么呢?下面我们首先来举个例子。当需要导出一些值时,此时这些值需要通过计算才能被导出,同时呢,有一些列还依赖于另外的一列或者更多列,如果一个列进行了更新则其依赖的列必须同步进行更新,上述场景通过对一个列或者多个列进行计算,此时我们需要定义一个将一个列或者多个列进行计算得到的值的列,这就是计算列。我们来看一个典型的例子,在一个公司上班的所有员工,在公司内部系统中会存其所有员工的信息,比如员工编号、出生日期等,如果此时我们需要导出员工的退休日期呢,假设在中国现在男性退休时间为60年后,此时我们需要通过出生日期算出60年后的日期,也就说在表中还需要定义一个退休日期列。下面我们创建表来看看计算列。
USE TSQL2012
GO
CREATE TABLE Employee
(
employeeNumber INT NOT NULL, --员工编号
employeeBirth DATETIME NOT NULL, --出生日期
employeeRetirement AS (DATEADD(YEAR, 60, (employeeBirth)-(1))) PERSISTED --退休日期
)
此时我们看到表中关于退休日期的设计,显示其已经是持久化了的
接下来我们插入测试数据看看
USE TSQL2012
GO
INSERT INTO dbo.Employee( employeeNumber, employeeBirth )
SELECT 305423 ,'1985-12-13' UNION ALL
SELECT 587650 ,'1989-11-18' UNION ALL
SELECT 221836 ,'1990-01-19' UNION ALL
SELECT 746104 ,'1993-06-13' UNION ALL
SELECT 139024 ,'1995-07-23'
然后我们来查询表
USE TSQL2012
GO
CREATE TABLE [dbo].[ComputeColumn]
(
ID INT,
FirstName VARCHAR(100),
LastName VARCHAR(100)
)
GO
在表中插入10万条数据
INSERT INTO [ComputeColumn] (ID,FirstName,LastName)
SELECT TOP 100000 ROW_NUMBER() OVER (ORDER BY a.name) RowID,
'Bob',
CASE WHEN ROW_NUMBER() OVER (ORDER BY a.name)%2 = 1 THEN 'Smith'
ELSE 'Brown' END
FROM sys.all_objects a
CROSS JOIN sys.all_objects b
GO
此时我们来看看有关表存储空间使用情况
USE TSQL2012
GO
sp_spaceused '[ComputeColumn]'
GO
上述我们得知存储数据为2680KB,下面我们再来创建计算列看看。
ALTER TABLE dbo.[ComputeColumn] ADD
FullName AS (FirstName+' '+LastName)
GO