Sql server Insert执行的秘密(上)一个最简单的INSERT分析 执行过程
来源:互联网 发布:电信网络制式频段 编辑:程序博客网 时间:2024/05/19 19:42
本文使用的是Sql server 2005
准备工作:
我需要一张User表,这张表有几个字段,还有一个自增长的数字id,表结构如下:
这是一张比现实应用中简单的多的用户表,UserID是自增长字段。
开始执行一个最简单的INSERT:
01 INSERT 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,如下:
1 INSERT 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。
出处:http://www.cnblogs.com/yukaizhao/
编缉推荐阅读以下文章
- Sql server Insert执行的秘密(下) 带外键的INSERT分析
- Sql server Insert执行的秘密(上)一个最简单的INSERT分析 执行过程
- Sql server Insert执行的秘密(上)一个最简单的INSERT分析
- Sql server Insert执行的秘密(下) 带外键的INSERT分析
- 用存储过程执行Insert和直接执行Insert的性能比较
- 用存储过程执行Insert和直接执行Insert的性能比较
- SQL Server执行INSERT后返回新增的IDENTITY列数值
- 执行insert等SQL语句时遇到的错误
- 执行数据导入的Bulk Insert与Insert Into
- MS SQL server 生成 insert 数据的存储过程脚本
- sql server 2005 导出insert 脚本的存储过程
- sql server 2008 执行insert返回主键ID
- 执行Insert Exec时的隐藏开销
- 批量insert语句的执行技巧
- SQL Server的存储过程复制执行
- AutoTRACE是分析SQL的执行计划,执行效率的一个非常简单方便的工具
- AutoTRACE是分析SQL的执行计划,执行效率的一个非常简单方便的工具
- 09PL_SQL过程之执行insert语句
- 执行一个安全的SQL Server安装
- Python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换。
- Windows 7恢复ubuntu10.04菜单
- ubuntu中用搜狗sougou浏览器加速上网的方法
- 火狐(FireFox)
- 电脑还原数据丢失的解决技巧
- Sql server Insert执行的秘密(上)一个最简单的INSERT分析 执行过程
- 值交换
- 新手开始学程序,学习什么语言好呢?呵呵
- VBS脚本简明教程
- 搜索算法:IDA*算法
- 大家好!
- C++ 初学者指南 第八章(6)
- Oracle PL/SQL 合并文本列
- 风之谷