执行计划之Insert,update,delete

 运行以下sql。

INSERT INTO [AdventureWorks].[Person].[Address] (  [AddressLine1], [AddressLine2], [City], [StateProvinceID], [PostalCode], [rowguid], [ModifiedDate]

) VALUES (   '1313 Mockingbird Lane', 'Basement', 'Springfield', '79', '02134', NEWID(), GETDATE() ) ;

执行计划如下图:

 

首先我们看到的是一个常量扫描(Constant Scan)

      做的工作是根据用户输入的sql中的常量生成一个行。

 常量扫描会引入一个或者多个常量行到一个查询中;通常情况下紧跟常量扫描的是计算标量运算符,计算标量运算符会为常量扫描运算符产生的行添加列。

计算标量(Compute Scalar)操作符调用一个getidentity函数。生成自增id的值,这一步输出了一个表达式expr1003

另一个标量操作符为其他数据生成一系列占位符并生成一个uniqueidentifier值,时间类型的数据来自于getdate()函数。

所有这些传递给聚集索引插入操作符。将数据插入到表中。如下图,将之前产生的表达式的值赋给列。

 

 聚集索引查找,因为StateProvinceID是外键,要查找stateProcience表是否存在此值。

 

 

如上图:这步中查找的对象是PK_StateProvince_StateProvinceID即StateProcince表。如果此表非常大时,扫描的开销也是非常大的。由此可以看出外键约束的影响,斟酌考虑。

断言(Assert):判断Expr1014的值是否为0.如果为0,则引发外键不存在的异常。

最后一步执行insert操作。

看了之后就忘,不如记录下来。其中有不正确的欢迎指正。

posted @ 2013-03-12 18:34  yingtaowz  阅读(948)  评论(0编辑  收藏  举报