`

Sql server Insert执行的秘密(上)一个最简单的INSERT分析

阅读更多

本文使用的是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。


0
0
分享到:
评论

相关推荐

    SQL SERVER:把表里的数据导出成为INSERT INTO脚本的存储过程

    根据提供的文件信息,我们可以构建一个详细的SQL Server存储过程来实现将表中的数据转换为`INSERT INTO`脚本的功能。此存储过程将适用于多种数据类型,并能够动态生成插入语句,以便用户可以方便地导出数据作为脚本...

    C#实现批量插入sqlserver数据

    在C#编程中,批量插入数据到SQL Server数据库是一个常见的需求,特别是在处理大量数据时,效率至关重要。本篇文章将详细探讨三种不同的批量插入方法:常规的`INSERT`语句、`SqlBulkCopy`类以及使用表值参数。我们将...

    sql server从一个数据库复制表到另一个数据库的方法

    在SQL Server中,将表从一个数据库复制到另一个数据库的过程涉及到数据库对象的迁移,这通常通过创建表的结构脚本和数据迁移来实现。以下是一个详细的步骤指南: 1. **启动SQL Server Management Studio (SSMS)**: ...

    sqlserver 批量创建表

    `SQL批量插入数据.sql`文件很可能是包含多条INSERT INTO语句的脚本,每条语句用于向一个特定的表中插入数据。例如: ```sql INSERT INTO Table1 (Column1, Column2) VALUES ('Value1', 'Value2') INSERT INTO Table...

    SQL Server中读取XML文件的简单做法

    `OPENXML`是一个返回行集的函数,允许你对XML数据执行JOINs操作,同时可以在不导入数据的情况下进行INSERT、SELECT、UPDATE和DELETE等操作。与`OPENROWSET`不同,`OPENXML`需要先使用`sp_xml_preparedocument`存储...

    SQLserver最全资料和案例

    这份"SQLserver最全资料和案例"压缩包显然包含了关于SQL Server的全面信息,特别是针对数据库的使用要点和实战案例,对于学习和提升SQL Server技能非常有价值。下面将深入探讨SQL Server的一些核心知识点。 1. SQL ...

    sql server导出语句

    1. **数据大小限制**:由于SQL Server的单个INSERT语句有8,000个字符的限制,对于包含大量数据的行,可能需要分批插入或使用多行INSERT语句。 2. **编码与特殊字符**:确保数据在导出和导入过程中保持正确的编码,...

    SQL Server存储过程基本语法

    ### SQL Server 存储过程基本语法知识点解析 #### 一、定义变量 在 SQL Server 中,我们可以使用 `DECLARE` 语句来定义变量,并通过 `SET` 或 `SELECT` 来给变量赋值。 ##### 1. 简单赋值 ```sql DECLARE @a int; ...

    战胜SQL Server必做练习50题

    SQL Server是微软公司推出的一款关系型数据库管理系统,广泛应用于企业数据存储、数据分析和业务处理等领域。为了提升在SQL Server中的技能,掌握好SQL语言至关重要。本文将针对"战胜SQL Server必做练习50题"这一...

    sqlserver使用方面

    除此之外,SQL Server还提供了许多高级功能,如视图(提供虚拟表)、触发器(自动执行特定操作)、存储过程(预编译的T-SQL代码块)、分区表(用于处理大数据量)以及数据仓库和OLAP服务(用于企业级数据分析)。...

    SQL Server数据库查询速度慢原因及优化方法

    【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: ...其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。

    SQLSERVER复习资料整理

    SQLSERVER复习资料整理 在IT领域,SQL Server是一款由微软公司开发的关系型数据库管理系统,它在数据存储、处理和管理方面扮演着至关重要的角色。这篇复习资料主要针对SQL Server数据库课程,涵盖了考试题和重修...

    连接sql server 2005的MFC简单入门

    本教程将引导您了解如何使用MFC连接到SQL Server 2005,实现一个简单的学生信息管理系统。 首先,我们需要创建一个MFC应用项目。在Visual Studio中,选择"新建项目",然后在模板中找到"MFC应用程序",按照向导的...

    sqlserver2012入门视频教程

    SQL Server是由微软开发和推广的关系型数据库管理系统(RDBMS),它提供了强大的数据存储、处理和分析功能,广泛应用于企业级应用系统中。SQL Server支持多种数据类型,如整型、浮点型、字符型、日期时间型等,并提供...

    最有价值的SQL Server2000 chm

    SQL Server 2000是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理、数据存储和数据分析中扮演着重要角色。本资源“最有价值的SQL Server 2000 chm”包含了该系统的核心知识,对于SQL Server的学习者和...

    sql server 2000 java驱动包

    这个驱动包使得Java开发者能够在Java平台上执行SQL查询,更新数据库,以及进行其他数据库操作。在本文中,我们将深入探讨与这个驱动包相关的各种知识点。 首先,我们要理解JDBC(Java Database Connectivity),它...

    sqlserver的存储过程与 where in 多值参数

    在SQL Server中,存储过程是预编译的SQL语句集合,它们封装了特定的数据库操作,提高了代码的重用性和执行效率。当涉及到处理多个值时,我们常常会遇到如何将这些值作为参数传递给存储过程的问题。本文将探讨在SQL ...

    SQL Server查询中的特殊字符处理(C#代码)

    为了解决上述问题,我们可以编写一个函数,该函数接收一个字符串作为输入,并返回一个经过特殊字符处理后的字符串,使其可以安全地用于SQL查询中。以下是一个示例实现: ```csharp using System.Text; public ...

    SqlServer基本案例的代码

    【SqlServer基本案例的代码】这个主题涵盖了SQL Server数据库管理系统的基础操作,主要涉及创建数据库表、数据插入以及可能的平台兼容性问题。SQL Server是一种广泛使用的数据库管理系统,由微软公司开发,适用于...

    SQL server 上机作业第一章

    SQL Server是一种关系型数据库管理系统,由Microsoft公司开发,广泛应用于数据存储、处理和分析。本上机作业将帮助你掌握SQL Server的核心功能,为后续的学习和实践打下坚实的基础。 首先,我们来了解SQL Server的...

Global site tag (gtag.js) - Google Analytics