`

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

阅读更多

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

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

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开销和锁资源的开销

3
2
分享到:
评论

相关推荐

    SQL Server数据库实验_存储过程与触发器设计.docx

    SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。当执行...

    SQLserver数据库管理系统需求分析.doc

    SQLserver数据库管理系统需求分析 ——成绩管理分析 1. 概述 2. SQLserver简介及知识介绍 三、数据库管理系统知识 四、需求分析—成绩管理 一、概述 成绩管理系统可以实现对成绩的管理,在此系统里可以查询、添加、...

    Oracle批量执行sql语句之禁用所有表的外键

    在转移数据库,进行数据导入的时候,遇到一件麻烦事,就是表间外键约束的存在,导致insert频频报错,批量执行sql语句又是顺序执行,没办法我只好手动输入。 然后输入到一半灵光一闪,为什么不先把外键约束全部禁用先...

    SQL Server 2008编程入门经典(第3版)

    第1章 RDBMS基础:SQLServer数据库的构成 1.1 数据库对象概述 1.1.1 数据库对象 1.1.2 事务日志 1.1.3 最基本的数据库对象:表 1.1.4 文件组 1.1.5 数据库关系图 1.1.6 视图 1.1.7 存储过程 1.1.8 用户自定义函数 ...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    《SQL Server 2008编程入门经典(第3版)》由浅入深逐步介绍了SQL Server数据库的高级主题,重点讨论了SQL Server 2008的特殊功能以及与其他编程环境的不同之处。作者Robert Vieria是Microsoft SQL,Server方面的权威...

    SQL入门之样例表脚本(Microsoft SQL Server)

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    《SQL Server 2008编程入门经典(第3版)》由浅入深逐步介绍了SQL Server数据库的高级主题,重点讨论了SQL Server 2008的特殊功能以及与其他编程环境的不同之处。作者Robert Vieria是Microsoft SQL,Server方面的权威...

    SQLServer数据库设计规范.txt

    2.8 Rule ru+Rule标识 2.9 主键 pk+表名+主键标识 2.10 外键 fk+表名+主表名+外键标识 2.11 索引 idx+字段标识 2.12 Default df+Default标识 3 编程结构和描述 SQL SERVER系统中,一个批处理是从客户传给服务器的一...

    精通SQL--结构化查询语言详解

    2.1.3 使用查询分析器执行sql语句 22 2.2 transact-sql 24 2.2.1 transact-sql 概述 24 2.2.2 transact-sql的主要组成 25 2.2.3 transact-sql的一些重要命令 26 2.3 oracle数据库 29 2.3.1 oracle数据库软件...

    如何使用SQL语句创建触发器

    例如当对某一表进行诸如`UPDATE`(修改)、`INSERT`(插入)、`DELETE`(删除)这些操作时,SQL Server 就会自动执行触发器所定义的`SQL`语句,从而确保对数据之间的相互关系,实时更新. 触发器的主要作用就是其能够实现由 ...

    21天学会SQL

    SQL Server 2008是微软的SQL Server数据库中的最新版本,在该版本的数据库产品中融入了更多商业智能的内容。本书中也使用了一篇专门讲解了与商业智能有关的一些内容。 本书总分为5篇,共21章。第一篇主要讲解数据库...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    SQL入门之样例表脚本(IBM DB2 SQL scripts)

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    SQL入门之样例表脚本(PostgreSQL SQL scripts).zip

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    SQL入门之样例表脚本(Oracle SQL scripts).zip

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    SQL入门之样例表脚本(Oracle Express SQL scripts).zip

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    SQL入门之样例表脚本(MySQL (and MariaDB) SQL scripts).zip

    1. create.text包含创建5个数据库表(包括定义所有主键和外键约束)的SQL语句。 2. populate.txt包含用来填充这些表的SQL INSERT语句。 这些文件中的SQL语句依赖于具体的DBMS,因此应该执行适合于你的DBMS的那个。...

    程序员的SQL金典.rar

     本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析;详细讲解数据库对增、删、改、查等SQL的支持并给出了相应的SQL应用案例;透彻分析函数...

    SQL2005入门到精通(12)

    260 12.3.3 使用T-SQL定义主键约束 261 12.4 外键约束 262 12.4.1 一个外键约束的示例 262 12.4.2 使用表设计器定义外键约束 263 12.4.3 使用T-SQL定义外键约束 265 12.5 UNIQUE约束 266 ...

Global site tag (gtag.js) - Google Analytics