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. iOS开发苹果内购的介绍与实现

    1.iOS开发苹果内购的介绍 1.1 介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝 ...

  2. Image和Base64相互转换

    1.图片转换为Base64 /// <summary> /// 图片转换为base64 /// </summary> /// <param name="imag ...

  3. RT-Thread Nano移植

    RT_Thread移植:在MDK下以组件形式提供 https://pan.baidu.com/s/1miac86O#list/path=%2Fsharelink4264488348-377157516 ...

  4. MyBatis逆向工程详细教程

    1 导入逆向工程到eclipse中 2 修改配置文件 注意修改以下几点: 修改要生成的数据库表 pojo文件所在包路径 Mapper所在的包路径 配置文件如下: <?xml version=&q ...

  5. 003-BootStrap完整模板

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

  6. c# Time类

    直接上代码 public KBehaviour() { //间隔时间 System.Timers.Timer t = ); t.Elapsed += new System.Timers.Elapsed ...

  7. Python基础(3) - 数据类型:2字符串类型

    Python字符串的表示有三种方法: 1.单引号(') >>>a = 'I love python. ' 2.双引号(") >>>a = " I ...

  8. Exception from System.loadLibrary(smjavaagentapi) java.lang.UnsatisfiedLinkError: no smjavaagentapi in java.library.path

    可能原因: 缺少smjavaagentapi.jar文件或者libsjavaagentapi.so缺少相关的依赖包. 解决方法: 1. 检查sso的lib下面是否有smjavaagentapi.jar ...

  9. touch-slide-image

    用htmls5+css3实现的在android和ios,以及wekit新版浏览器上实现手指滑动切换图片. https://github.com/navyxie/touch-slide-image

  10. ASP.NET Web API根据代码注释生成Help文档

    使用Visual Studio新建一个ASP.NET Web API项目,直接运行,查看Help文档可以看到如下的API帮助说明 如何在Description中显示描述. 1. 打开Controlle ...