SQL Server INSERT执行的秘密(上)

日期: 2010-07-04 作者:玉开 来源:TechTarget中国 英文

  本文使用的是Sql server 2005

  准备工作:

  我需要一张User表,这张表有几个字段,还有一个自增长的数字id,表结构如下:

  

  这是一张比现实应用中简单的多的用户表,UserID是自增长字段。

  开始执行一个最简单的INSERT:

  01INSERT INTO [DB_BJ].[dbo].[User]
  02 ([UserName]
  03 ,[Email]
  04 ,[Signature]
  05 ,[CreateTime]
  06 ,[IP])
  07 VALUES
  08 (‘yukaizhao’
  09 ,’yukaizhao@abc.com’
  10 ,’My Blog is http://www.cnblogs.com/yukaizhao/’
  11 ,’2010-06-01′
  12 ,’127.0.0.1′)

  我们在sql server管理器中,选中工具栏中的显示执行计划的图标(下图),并执行语句:

  

  其执行计划如下所示:

  

  查询计划显示sql server执行的sql并非我们写的原始sql,sql server先智能的将我们的sql语句转换为一个参数话的sql,如下:

  1INSERT INTO [DB_BJ].[dbo].[User]([UserName],[Email],[Signature],[CreateTime],[IP]) values(@1,@2,@3,@4,@5)

  Sql server做了这步转换之后就可以让使用不同参数的sql可以使用同一个经过预编译的sql语句。

  我们从执行计划的各个步骤看一下这个insert的执行过程,注意看sql server的执行计划要从右往左看.

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

  MSDN的原话如下:

  ”The Constant Scan operator introduces one or more constant rows into a query. A Compute Scalar operator is often used after a Constant Scan to add columns to a row produced by the Constant Scan operator”

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

  2. 计算标量,在这一步生成了自增id的值,请看下图,这一步输出了一个表达式Expr1003,为什么这个输出值是自增id,请看第4中的图

  

  3. 第二个计算标量,将原始sql中的常量值赋给5个变量

  4. 聚集索引插入,执行插入操作,将数据加入到数据表中,请看下图:

  

  图中的第一个红框是给UserName赋值的表达式,[DB_BJ].[dbo].[User].[UserName] = RaiseIfNull([Expr1004]) ,这个谓词中的DB_BJ是我的测试数据库名字,RaiseIfNull应该是sql server自动添加的函数,用来在参数值为NULL是抛出异常;但是这个函数是不允许用户调用的。

  第二个红框是给UserID赋值的,这里可以印证我们在第2步中的推断。

  5. 最后一步是Insert,这一步将输入的sql语句的执行计划存储起来以便复用。

  这只是一个最简单的INSERT语句的分析,下一篇我们继续分析一个稍微复杂一点的INSERT。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

玉开
玉开

相关推荐