接上文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的性能最好。当然后面可能会有更多的新特性来提升。另外即使本身不支持,其他的外部工具也可以提升导入数据。
最后,数据导入的性能始终会到达天花板,不过随着大数据的发展,数据的计算并不需要总是移动数据,只需要移动计算到数据上面就可以了。所以我后续也会关注一下其他方式来实现数据的快速加载。
由于时间关系,还没有测试分区的性能,因为分区和内存表目前还不兼容,所以暂时不打算测试,有空的时候我也会测试一下。