SQL Server 2016对INSERT INTO XXXX SELECT语句进行了优化,在某些情况下可以触发数据的并行插入,但是要求兼容模式是130(SQL Server 2016)以及在插入的时候加表锁(WITH(TABLOCK))。那是不是大部分情况都能触发,并不是。除了上面提到的两点必要条件,还有苛刻的限制条件:1)不能有额外的索引,目标表只能是堆或者聚集索引的存储模式;2)表不能有SEQUENCE字段或者IDENTITY字段;当然这两点是基于目标表是B树或者堆存储结构的表。SQL Server 2016对ColumnStored Index做了大量优化,加入Batch Mode,也就是数据在插入到列存储索引的时候就是并行插入的。

首先第一种情况是从一张表select insert into到另外一张表。这种情况是可以触发并行插入的。但是和具体有多少行有关系。整个测试中我测试了5W、10W、100W行。结果发现还要和执行计划扯上关系。如果第一次插入是10W行或者100W行都触发了并行,但是第二次改成5W行则没有并行,当插入5W行后执行计划被缓存了,再插入100W行也不会触发并行。只有重编译或者重建表索引导致查询语句下次重编译才会触发并行(插入100W行)。而触发并行的临界点,在测试例子中是10W行。第二种情况是多张表连接后插入数据。这个例子里面还要分开来看。就是目标表是启用了兼容模式是130,而且也加了表锁,但是源表的数据库可能不是SQL Server 2016的兼容模式,是否对结果造成影响。按道理应该是不会,因为并行是对数据插入的并行,而不影响连接表的库的来源或者兼容模式是什么。但是测试下来发现,即便我插入了100W行也没能触发并行。

情况1脚本

CREATE TABLE [dbo].[Table_1](
[col1] [int] NULL,
[col2] [nvarchar](50) NULL,
[col3] [datetime] NULL
) ON [PRIMARY] GO CREATE TABLE [dbo].[Table_2](
[col1] [int] NULL,
[col2] [nvarchar](50) NULL,
[col3] [datetime] NULL
) ON [PRIMARY] GO insert [dbo].[Table_1]WITH(TABLOCK)
select TOP 1000000 CHECKSUM(NEWID()), REPLICATE('a',50), getdate()
from sys.columns a, sys.columns b insert [dbo].[Table_2]WITH(TABLOCK)
select * from [dbo].[Table_1]
OPTION (RECOMPILE) TRUNCATE TABLE [dbo].[Table_1]
TRUNCATE TABLE [dbo].[Table_2]

参考:

SQLSweet16!, Episode 3: Parallel INSERT … SELECT

Real World Parallel INSERT…SELECT: What else you need to know!

SQL Server ->> SQL Server 2016重要功能改进之 -- INSERT SELECT时并发插入数据的更多相关文章

  1. Windows Server 2016-Win Ser 2016新增功能

    本来想着整个系列都是与Active Directory相关的内容,上一章节我们应读者要求补充了Window Server 2016标准版与数据中心版的区别,鉴于读者的疑惑,从本章节开始补充三到五章与W ...

  2. Sql Server 2016 新功能——内置的 Temporal Tables

    放假之前老大跟我提起了一下2016有个有趣的功能叫 Temporal Table ,今天去看了一下资料整理一下. 这个功能看上去像是临时表,但是其实是系统维护的一个历史记录表.(在某个程度上面比起我们 ...

  3. SQL Server 2016 共享功能目录 不可修改

    x 个人电脑上没有安装MSSQL,以前需要链接数据库写SQL,都是在{VS ->>视图->>SQL Server对象资源管理器}直接链接数据库进行访问操作的... 但是确实有些 ...

  4. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  5. sql server实现自定义分割月功能

    本文目录列表: 1.为何出现自定义分割月需求 2.sql server实现自定义分割月功能 3.测试验证效果 4.总结语 5.参考清单列表   1.为何出现自定义分割月的需求   今天梳理一个平台的所 ...

  6. SQL Server 2012 数据库各个版本功能对比

    作为这篇SQL SERVER 2008数据库各版本功能对比 的姊妹篇,就写点SQL Server 2012 各个版本的区别以及物理以及逻辑上的限制. 个部分来分http://technet.micro ...

  7. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

  8. SQL Server 2005中的CHECKSUM功能

    原文:SQL Server 2005中的CHECKSUM功能 转自此处 页面 checksum 是SQL2005的新功能,提供了一种比残缺页检测强大的机制检测IO方面的损坏.以下是详细描述: 页面 C ...

  9. .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)

    原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...

随机推荐

  1. Sqlite shell 的使用

    学习python中,涉及SQLite3数据库的操作,其中一种是使用sqlite shell,在园子里找到下面这篇文章,跟着试了下,挺好. 这里要注意,语句是C语言规范的吧,语句末尾需要";& ...

  2. module.exports,exports,export和export default,import与require区别与联系

    还在为module.exports.exports.export和export default,import和require区别与联系发愁吗,这一篇基本就够了! 一.首先搞清楚一个基本问题: modu ...

  3. 服务端模拟http服务请求客户端

    try { InputStream in = req.getInputStream(); int i = -1; ByteArrayOutputStream out = new ByteArrayOu ...

  4. vscode用yuml画类图

    vscode用yuml画类图 最近在找画类图的工具,发现vscode一款插件很好用,还支持markdown.vscode插件中直接搜索yuml安装即可. 文件后缀.yuml. 文件开头第一行这样写// ...

  5. 在vue中import()语法不能传入变量

    解决办法: 一定要用变量的时候,可以通过字符串模板来提供部分信息给webpack:例如import(`./path/${myFile}`), 这样编译时会编译所有./path下的模块,但运行时确定my ...

  6. Unity 动画 命名

    unity标准的动画命名格式是 ?模型名@动画名 如boss1@idle ,这样导入进来之后unity会自动给这个动画命名为idle而不是Take 001.

  7. Testlink 机器重启后Access denied for user 'admin '@'localhost' (using password: YES)解决

    问题表现: 装完Testlink,重启系统后,在testlink权限未分配会出现如下提示: 1045 - Access denied for user 'Testlink '@'localhost' ...

  8. 使用group by rollup和group by cube后的辅助函数

    本文主要介绍,报表在使用group by rollup和group by cube后的辅助函数. CREATE TABLE TEST8 ( "ID" NUMBER, "O ...

  9. 003-BootStrap完整模板

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  10. 1、Shell命令行书写规则

    学习目标Shell命令行书写规则 正文对Shell命令行基本功能的理解有助于编写更好的Shell程序,在执行Shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: ro ...