SQL Server导入性能对比(1)——WITH TABLOCK并行导入

随着大数据和大量数据系统的出现,数据的加载变得越来越重要,很多岗位甚至只需要ETL技能,不过今时今日数据加载已经不再是单纯的ETL,还有ELT,甚至不需要进行数据移动的计算等等。
本文先把精力放在传统的ETL上。介绍几种数据加载的过程和对比。

本系列文章包含本文及:
SQL Server导入性能对比(2)——非聚集列存储索导入
SQL Server导入性能对比(3)——In-Memory搭配聚集列存储索引

常规数据加载方式

  数据加载的本质就是把数据插入特定的地方,通常我们关注的是性能,说白了就是插入完成的时间,及引起的空间消耗。
  本文及后面两篇文章将介绍和演示几种常规的插入方式,包括:

  1. 带有WITH (TABLOCK)的INSERT SELECT
  2. 非聚集列存储索引
  3. In-Memory搭配聚集列存储索引

INSERT SELECT with(TABLOCK)

  使用这种方式,可以实现并行插入,目标表可以是聚集列存储索引,但是也可以是堆表。但是我们把目光放到列存储索引上,因为从上一篇文章中可以看到,列存储索引确实有好处,而且因为我目前使用的是Azure SQL DB,底层来说已经是SQL 2019的功能,所以我暂时不讨论堆表。
  这种并行功能从SQL 2016开始引入,也就是2014并没有这个并行得功能。不管有多少个cores,insert into到聚集列存储索引都是使用单一的core进行,一开始先顺序填满Delta-Store,直到达到了第一个可用Delta-Store的最小可用行数(1048576行)。然后开始下一个Delta-Store。
  在INSERT SELECT过程中,不管SELECT部分多高效,INSERT性能都将成为最慢的部分。但是这种设计是为了保证最后的哪个Delta-Store不会被完全填满,然后在后续载入更多的数据。
  从SQL 2016(兼容级别是130或以上)开始,当带上WITH (TABLOCK)是,可以实现并行插入。根据当前CPU和内存资源,每个CPU core都对应一个独立的Delta-Store,使得数据的载入更加快。理论上说,如果磁盘的能力和大小足够大,那么core越多,相比起2014,性能也就成倍增加。但是正如前面说的,2014中,最后一个Delta-Store需要整理,在2016中,就是有N个Delta-Store需要整理,这是它的缺点,不过可以通过一些手段来缓解,比如重组索引。

上面的版本区别还需要考虑兼容级别,如果你安装SQL 2016但是兼容级别小于130,那么本质上还是等于使用低于2016的版本。

  下面我们用ContosoRetailDW库来演示一下。先清理一下上面FactOnlineSales的主键和外键约束,然后创建一个聚集的列存储索引:

use ContosoRetailDW;
 
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [FK_FactOnlineSales_DimCurrency]
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [FK_FactOnlineSales_DimCustomer]
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [FK_FactOnlineSales_DimDate]
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [FK_FactOnlineSales_DimProduct]
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [FK_FactOnlineSales_DimPromotion]
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [FK_FactOnlineSales_DimStore] 
ALTER TABLE dbo.[FactOnlineSales] DROP CONSTRAINT [PK_FactOnlineSales_SalesKey];
 
create clustered index PK_FactOnlineSales on dbo.FactOnlineSales( OnlineSalesKey ) with ( maxdop = 1);
 
create clustered columnstore Index PK_FactOnlineSales on dbo.FactOnlineSales with( drop_existing = on, maxdop = 1 );

  然后创建一个测试表,

CREATE TABLE [dbo].[FactOnlineSales_CCI](
     [OnlineSalesKey] [int] NOT NULL,
     [StoreKey] [int] NOT NULL,
     [ProductKey] [int] NOT NULL,
     [PromotionKey] [int] NOT NULL,
     [CurrencyKey] [int] NOT NULL,
     [CustomerKey] [int] 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值