接上文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的性能最好。當然後面可能會有更多的新特性來提升。另外即使本身不支持,其他的外部工具也可以提升導入數據。
最後,數據導入的性能始終會到達天花板,不過隨着大數據的發展,數據的計算並不需要總是移動數據,只需要移動計算到數據上面就可以了。所以我後續也會關注一下其他方式來實現數據的快速加載。
由於時間關係,還沒有測試分區的性能,因爲分區和內存表目前還不兼容,所以暫時不打算測試,有空的時候我也會測試一下。