sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...
准备工作:
我需要一张User表,这张表有几个字段,还有一个自增长的数字id,表结构如下:
这是一张比现实应用中简单的多的用户表,UserID是自增长字段。
开始执行一个最简单的INSERT:
INSERT INTO [DB_BJ].[dbo].[User] ([UserName] ,[Email] ,[Signature] ,[CreateTime] ,[IP]) VALUES ('yukaizhao' ,'yukaizhao@abc.com' ,'My Blog is http://www.cnblogs.com/yukaizhao/' ,'2010-06-01' ,'127.0.0.1')
我们在sql server管理器中,选中工具栏中的显示执行计划的图标(下图),并执行语句:
其执行计划如下所示:
查询计划显示sql server执行的sql并非我们写的原始sql,sql server先智能的将我们的sql语句转换为一个参数化的sql,如下:
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赋值的,把生成的自增id赋值给UserID,[DB_BJ].[dbo].[User].[UserID] = [Expr1003] ,这里可以印证我们在第2步中的推断。
5. 最后一步是insert,这一步将输入的sql语句的执行计划存储起来以便复用。
这就是一个最简单的INSERT语句的分析^_^
文章转载自:
http://www.cnblogs.com/yukaizhao/archive/2010/07/02/sql-server-insert-secret.html
文章经作者授权转载,版权归原文作者所有
图片来源于网络,侵权必删!
sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...相关推荐
- Sql server Insert执行的秘密(下) 带外键的INSERT分析
2019独角兽企业重金招聘Python工程师标准>>> 这一篇分析一下带外键表的INSERT的例子. 本文所用的数据表结构如上图所示:其中Blog表上BlogID是自增的主键,并 ...
- sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析
上一篇文章介绍了一个最简单INSERT语句的执行计划详细情况,这一篇分析一下带外键表的INSERT的例子. 本文所用的数据表结构如上图所示:其中Blog表上BlogID是自增主键,并在CreateUs ...
- 视频教程-数据库SQL查询,最佳案例讲解-SQL Server
数据库SQL查询,最佳案例讲解 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥19.00 立即订阅 ...
- SQL server 系统优化--通过执行计划优化索引(1) (转)
SQL server 系统优化--通过执行计划优化索引(1) 前几天,远离上海,到了温州,在客户的这边处理系统慢,该系统每天正常down机7次左右,在线人员一多,系统运行缓慢,严重影响业务操作,到了无 ...
- sql server死锁_如何使用扩展事件和SQL Server代理自动执行SQL Server死锁收集过程
sql server死锁 介绍 (Introduction) This article is the last one of a series in which we discussed how to ...
- SQL Server中的执行计划
介绍 (Introduction) In this article, I'm going to explain what the Execution Plans in SQL Server are a ...
- SQL Server 2005全文检索技术在网站上的应用实录
SQL Server 2005全文检索技术在网站上的应用实录 一.前言 "人类失去搜索,世界将会怎样?",同样,很难想象一个拥有极大信息量的行业网站门户没有站内全文搜索将会出现怎样 ...
- 08001-命名通道提供程序:无法打开与SQL Server的连接[53] 08001-命名管道提供程序:无法打开与SQL Server的连接[1326] 数据库连接不上提示08001
08001-命名通道提供程序:无法打开与SQL Server的连接[53] 08001-命名管道提供程序:无法打开与SQL Server的连接[1326] 数据库连接不上提示08001 数据库连接的时 ...
- 将本地的MS SQL Server数据导入到远程服务器上
该演示引导客户将本地的MS SQL Server数据导入到远程服务器上,供客户的网站使用. 首先登录到远程数据库服务器: 1.右击您准备导入数据的数据库,选择"所有任务"下的&qu ...
最新文章
- Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
- es6学习---.babelrc文件
- 比特币交易追踪溯源技术介绍
- 32 六角oled驱动_Alienware下半年开售55英寸OLED显示器,4K120Hz、95%DCI-P3
- 实现迭代型的echo服务器
- foxmail 怎么把邮件格式默认为html_Python SMTP发送邮件-smtplib模块
- ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译
- Java命名规范(建议收藏)
- Fedora音视频解码的配置
- c语言二级选择题APP,C语言二级考试题库
- ,PLCSIM、SIMIT、Amesim、NX MCD、 Process Simulate、Plant Simulation,一文带你了解西门子整个虚拟调试与仿真软硬件体系
- 坐拥百度/阿里/腾讯,这家车载导航上市公司的营收却一路下挫?
- 博图只能通过地址相同设备找到plc_很多人想要的博途PLC通讯控制变频器,PN方式,赶快收藏吧...
- MySQL相关知识整理
- [CityHunter]游戏流程设计及技术要点
- RocketMQ集群(2主2从)搭建详细步骤
- 一佳门户多商户多行业v3.0.0
- 拉钩招聘信息爬取以及可视化
- Stata | 分组回归系数差异性检验
- mysql locate和instr_Mysql函数instr、locate、position VS like
热门文章
- 如何屏蔽Canvas指纹跟踪
- iOS开发之UIApplication
- UISegmentedControl UISlider
- cisco必须要拿下它-----今年的目的
- 21位美国名校学生领袖在湖北了解中国媒体情况
- Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...
- thinkPHP的Excel插件
- C# ListView用法详解
- Qt C/C++统计运行时间
- Enterprise Library 4.1学习笔记3----安全应用程序块