SQL Server导入性能对比(3)——In-Memory搭配聚集列存储索引

接上文SQL Server导入性能对比(2)——非聚集列存储索导入,本文测试In-Memory搭配聚集列存储索引的导入性能。

环境准备

  先创建测试表,in-memory需要数据库开启“MEMORY_OPTIMIZED_DATA”并且添加专用文件组:

use master;
GO

ALTER DATABASE [ContosoRetailDW] 
	ADD FILEGROUP [ContosoRetailDW_Hekaton] 
	CONTAINS MEMORY_OPTIMIZED_DATA
GO

ALTER DATABASE [ContosoRetailDW]
	ADD FILE(NAME = ContosoRetailDW_HekatonDir, 
	FILENAME = '/var/opt/mssql/data/xtp') 
	TO FILEGROUP [ContosoRetailDW_Hekaton];

GO
USE [ContosoRetailDW]
go

CREATE TABLE [dbo].[FactOnlineSales_Hekaton](
     [OnlineSalesKey] [int] NOT NULL,
     [StoreKey] [int] NOT NULL,
     [ProductKey] [int] NOT NULL,
     [PromotionKey] [int] NOT NULL,
     [CurrencyKey] [int] NOT NULL,
     [CustomerKey] [int] NOT NULL,
     Constraint PK_FactOnlineSales_Hekaton PRIMARY KEY NONCLUSTERED ([OnlineSalesKey]),
     INDEX IX_FactOnlineSales_Hekaton_NCCI Clustered Columnstore
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);

  in-memory需要比较多的内存,所以需要修改一下,在Linux上需要先到OS层配置,这里改成10G:

~$ sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 10240

  这个操作需要重启服务,不过实验环境没所谓,重启一下。
在这里插入图片描述
  另外内存表不支持truncate table,需要使用delete from 命令来删除数据。
  最后把兼容级别改回140。

实验

  下面开始导入,这次同样还是500万数据,因为1000万数据对我的服务器来说还是相对较大:

set statistics time, io on;
 
insert into [dbo].[FactOnlineSales_Hekaton] 
                        (
                        OnlineSalesKey, StoreKey, ProductKey, PromotionKey, CurrencyKey, CustomerKey
                        ) 
 
select distinct top 5000000  OnlineSalesKey,  store.StoreKey, sales.ProductKey, PromotionKey, CurrencyKey, CustomerKey 
  FROM [dbo].[FactOnlineSales] sales
        inner join dbo.DimProduct prod
                                on sales.ProductKey = prod.ProductKey
        inner join dbo.DimStore store
                                on sales.StoreKey = store.StoreKey
  where prod.ProductSubcategoryKey >= 10
                        and store.StoreManager >= 30
  option (recompile);

  从时间上来看,并没有明显增加。
在这里插入图片描述

  从执行计划来看,没有并行,由于内存表并不支持WITH TABLOCK,所以没办法测试。
在这里插入图片描述

总结

  经过这三篇文章的测试:SQL Server导入性能对比(1)——WITH TABLOCK并行导入
SQL Server导入性能对比(2)——非聚集列存储索导入
和本文可以看出,即使数据理不相同,也可以看出,使用WITH TABLOCK的性能最好。当然后面可能会有更多的新特性来提升。另外即使本身不支持,其他的外部工具也可以提升导入数据。
  最后,数据导入的性能始终会到达天花板,不过随着大数据的发展,数据的计算并不需要总是移动数据,只需要移动计算到数据上面就可以了。所以我后续也会关注一下其他方式来实现数据的快速加载。
  由于时间关系,还没有测试分区的性能,因为分区和内存表目前还不兼容,所以暂时不打算测试,有空的时候我也会测试一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章