文档章节

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

vinci321
 vinci321
发布于 2017/12/24 12:56
字数 882
阅读 6
收藏 0

这一篇分析一下带外键表的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开销和锁资源的开销

本文转载自:http://www.cnblogs.com/yukaizhao/archive/2010/07/05/sql-server-insert-2.html

共有 人打赏支持
vinci321
粉丝 6
博文 173
码字总数 217682
作品 0
私信 提问
Sql server Insert执行的秘密(下) 带外键的INSERT分析

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

长平狐
2012/06/08
159
0
Sql server Insert执行的秘密(上)一个最简单的INSERT分析

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

长平狐
2012/06/08
145
0
使用T-SQL语句插入、更新、删除数据表

在对数据进行管理时,使用SSMS进行数据维护有可视化、方便的优点,但是在批量维护或重复维护时,使用SSMS就不方便了,还容易出错,这就需要编写SQL语句对数据库进行维护 SQL和T-SQL SQL是Str...

杨书凡
2017/11/21
0
0
SQL Server 常用 几个设置(set)选项

SET DEADLOCK_PRIORITY   2. SET LOCK_TIMEOUT   3.@@LOCK_TIMEOUT   4.SET IDENTITY_INSERT   5.SET IMPLICIT_TRANSACTIONS   6.SET NOCOUNT   7.@@ROWCOUNT   8.SET ROWCOUN......

Yamazaki
2012/05/31
0
0
案例分析:你造吗?有个ORA-60死锁的解决方案

问题综述 1 这段时间应用一直被一个诡异的 ORA-00060 的错误所困扰,众所周知,造成 ORA-00060 的原因是由于应用逻辑,而非 Oracle 数据库自己,之所以说诡异(“诡异”可能不准确,只能说这种...

技术小能手
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day177-2018-12-14-英语流利阅读-待学习

艾滋病的治愈方法是否触手可及? Daniel 2018-12-14 1.今日导读 几十年来,艾滋病一直是世界上最难对付的“超级绝症”之一,从人类历史上第一次诊断出艾滋病病例的 20 世纪 80 年代早期到 20...

飞鱼说编程
13分钟前
2
0
java 合成两张图片或图片与二维码

java中偶尔会出现需要将一张小图片嵌入大图中或带二维码的海报图片,那么本文就是奔着这个目的来的,直接上腊肉! zxing是生成1D和2D条形或二维码的工具类库,java图形库Graphics2D进行图片的...

貔貅叔
18分钟前
0
0
80后阿里P10,“关老板”如何带着MaxCompute一路升级?

我是个幸运的人。虽然幸运不能被复制,但是眼光和努力可以。 关涛/关老板,80后的阿里P10,阿里巴巴通用计算平台负责人,阿里巴巴计算平台研究员。12年职场人生,微软和阿里的选择。 关涛的花...

阿里云官方博客
34分钟前
1
0
开源软件和开源模式面临的生存危机

开源模式可能正面临一场危机。越来越多的开源软件和平台被大型云计算服务商融入自家的云服务体系,并以此获利颇丰,但并不支付费用,也没有对开源社区做出相应的回馈。而实际上,大部分开源软...

Linux就该这么学
34分钟前
1
0
统一服务消息返回错误:{"errcode":40165,"errmsg":"invalid weapp pagepath hint: [bsAWua0201ge30]"}

{"errcode":40165,"errmsg":"invalid weapp pagepath hint: [bsAWua0201ge30]"} 原因:pagepath参数为所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar), 以前配置的是:m...

tianma3798
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部