2019独角兽企业重金招聘Python工程师标准>>>

这一篇分析一下带外键表的INSERT的例子。
 
本文所用的数据表结构如上图所示;其中Blog表上BlogID是自增的主键,并在CreateUserID和CreateTime列上分别建有两个非唯一索引。

我们要往Blog表中插入一条数据,并分析其执行情况。
INSERT 语句如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

INSERT INTO [DB_Cn].[dbo].[Blog]

           ([Title]

           ,[Tags]

           ,[Content]

           ,[CreateUserID]

           ,[CreateTime]

           ,[IP])

     VALUES

           ('这是一个测试博客标题'

           ,'测试'

           ,'这是测试博客的内容,博主的地址是http://www.cnblogs.com/yukaizhao/'

           ,100

           ,'2010-01-06'

           ,'127.0.0.1');

其执行计划要稍微复杂一些,如下所示
 

从右向左分析,第一步中的常量扫描是根据用户输入的sql语句生成一个数据行;第一个常量扫描生成了一个新的自增长id;第二个计算标量则是计算用户输入的sql语句中的常量值,这些在上一篇文章中有详细的叙述,请参考上文。
第四步是分叉的两步操作,上面的操作是聚集索引插入,下一步的操作是对User表的聚集索引查找,如下图是聚集索引插入的详细情况:
 
逻辑索引插入的部分估计开销为90%,这一步插入Blog表的主键,Blog表的两个索引IX_Blog和IX_Blog_CreateTime,对这两个索引的操作说明了在表中建索引会对表的插入操作效率产生负面影响;由于Blog表的CreateUserID字段是个外键,所以这一步还有一个输出列表输出了CreateUserID字段;这个字段要用来做外键是否存在的判断。

我们再看下对User表的聚集索引查找操作的详细情况:
 
这步中查找的对象是PK_User及User表的主键,主键的扫描是非常迅速的,尽管如此当User表非常大时,扫描的开销也是非常可观的。这里扫描的开销可以分为两个部分,一部分是cpu的开销,另外一个方面是扫描时sql server会自动给主键加上一个共享锁,既然加锁就有可能会造成死锁或排他锁的等待。

从这一步看如果我们对响应速度的要求远大于对数据一致性的要求时,可以考虑删掉外键,去掉这一步不必要的开销。

第五步:对第四步两个分叉操作产生的输出进行嵌套循环,这一步嵌套循环是为下一步的Assert做准备
第六部:Assert判断嵌套循环产生的CreateUserID是否为NULL,如果为NULL则会引发外键不存在的异常
最后一步执行INSERT操作。

从以上分析可以得出几点心得
1. 为什么使用自增长字段,在插入数据失败时自增长字段的编号会被占用?
因为自增长字段的值是在第二部计算标量是产生的,这一步已经将自增id加1了

2. 为什么给表建的索引多了会影响插入的性能
因为每一次插入都需要对每一个索引进行插入

3. 为什么在做大并发设计时,会不建外键,或将外键删除掉
因为外键会带来额外的cpu开销和锁资源的开销

转载于:https://my.oschina.net/u/3412738/blog/1594193

Sql server Insert执行的秘密(下) 带外键的INSERT分析相关推荐

  1. sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析

    上一篇文章介绍了一个最简单INSERT语句的执行计划详细情况,这一篇分析一下带外键表的INSERT的例子. 本文所用的数据表结构如上图所示:其中Blog表上BlogID是自增主键,并在CreateUs ...

  2. sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...

    准备工作: 我需要一张User表,这张表有几个字段,还有一个自增长的数字id,表结构如下: 这是一张比现实应用中简单的多的用户表,UserID是自增长字段. 开始执行一个最简单的INSERT: INS ...

  3. sql server 锁与事务拨云见日(下)

    sql server 锁与事务拨云见日(下) 原文:sql server 锁与事务拨云见日(下) 在锁与事务系列里已经写完了上篇中篇,这次写完下篇.这个系列俺自认为是有条不紊的进行,但感觉锁与事务还是 ...

  4. 了解Sql Server的执行计划

    前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句.但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性 ...

  5. sql server在执行批处理时出现错误。错误消息为: 目录名无效

    今天在客户服务器上的sql server上执行脚本,报错提示"在执行批处理时出现错误.错误消息为:目录名无效",第一反应就是客户是不是在服务器装了360,因为之前有类似问题,360 ...

  6. SQL Server查询执行计划–基础

    为什么查询执行对SQL Server性能很重要? (Why is query execution important for SQL Server performance?) SQL Server性能 ...

  7. sql查询初学者指南_面向初学者SQL Server查询执行计划–类型和选项

    sql查询初学者指南 When a DBA is working with the SQL Server, he/she might sometimes say that the execution ...

  8. sql查询初学者指南_面向初学者SQL Server查询执行计划–聚集索引运算符

    sql查询初学者指南 We have discussed how to created estimated execution plans and actual execution plans in ...

  9. sql查询初学者指南_面向初学者SQL Server查询执行计划–非聚集索引运算符

    sql查询初学者指南 Now that we understand what Clustered Index Scan and Clustered Index Seek are, how they o ...

最新文章

  1. ads1115寄存器操作
  2. 决策树c语言程序代码,R C5.0 决策树c50代码,名为 exit 1_r_开发99编程知识库
  3. good helper for your math homework: https://www.wolframalpha.com/
  4. 模拟课----需求文本
  5. 微服务之迷思--转几位大牛的文章
  6. 程序员基本功02对象与内存控制
  7. linux命令中cd / 和 cd ~
  8. 华为qy2音乐如何转换为mp3_华为手机还有这种骚操作?开启这个功能,让你体验至尊级待遇...
  9. JAVA笔记 之 Thread线程
  10. Spring 源码(四)解析配置类
  11. Conficker.AE病毒局域网扫描工具
  12. 压摆率和上升时间的区别
  13. Supervisor进程管理详解
  14. 深入理解地球的经度和纬度换算
  15. Webpack:We noticed you‘re using the `useBuiltIns` option without declaring a core-js version.
  16. 飞火流星测试经验总结
  17. 如何卸载360安全卫士后windows系统启动项里面有360tray
  18. jsr 正则验证_使用JSR-303进行校验 @Valid
  19. 狂飙突进的幻想乡 - 最短路 - 辛普森积分
  20. 查找文件中每行第二个单词_NOIP训练营内部试题快速记单词

热门文章

  1. ajax的auto是true,一个AJAX自动完成功能的js封装源码[支持中文]
  2. mysql分组和where条件查询_【MySQL】:分组查询where和having
  3. 动态展开所有_库存与市场需求之间如何“动态”共舞?库存计划动态模型构建分享...
  4. Java项目:精品酒店管理系统(java+SSM+mysql+maven+tomcat)
  5. #串口通信超时处理_简单通信协议
  6. fabric 启动peer_编写 Fabric 链码的一般准则
  7. SpringBoot 操作elasticsearch
  8. spark编程基础--2.4函数式编程基础
  9. 同一个类 cannot be cast to_留学热门assignment之 税收筹划类essay
  10. 封装 localStorage 缓存,兼容网页,微信小程序,uni-app