SQL Server INSET/UPDATE/DELETE的执行计划

DML操作符包括增删改查等操作方式。

insert into Person.Address
(AddressLine1,
AddressLine2,
City,
StateProvinceID,
PostalCode,
rowguid,
ModifiedDate)
values(
N'1313 Mockingbird Lane',
N'Basement',
N'Springfield',
79,
N'02134',
NEWID(),
GETDATE()
)

  

如此简单的INSERT语句,执行计划比前面的SELECT语句还要复杂,表中有自增列、外键约束和空间数据列。

出现新的操作符:常量扫描(Constant Scan),这个操作符会引入一个常量到查询中,由它创建了一列空行以便后面两个操作符有位置可以添加他们的输出。

这两个操作符一个是标量计算(Compute Scalar),调用getidentity函数,用于产生自增值和标量数据,当INSET失败时,可以通过这个值获取失败信息;另一个操作是标量(Scalar)操作,它会产生一个序列用于新的uniqueidentifier值(因为表中有NEWID()函数),同时会产生GETDATE()函数所需要的日期和时间,接下来就是聚集索引插入操作了,这个执行计划中最大开销的部分,然后进入Nested Loops中,由于有外键,所以需要额外关联一个表StateProvince获取与之关联的外键StateProvinceID,经过关联后产生一个新的表达式,用于被下一个操作符Assert检测,这个Assert操作是否存在特定的条件,如果限制条件不存在,就把符合条件的数据插入到Person.Address.StateProvinceID列,然后结束INSET操作。

2.UPDATE

update Person.Address set City='Munro',ModifiedDate=GETDATE()
where City='Monroe'

  

最右边是一个非聚集索引扫描,并不是什么高效的操作。

可以进行索引策略来提高性能。

猜你喜欢

转载自www.cnblogs.com/sunliyuan/p/9784262.html