Sql-Server

多執行緒/並行插入和雜湊分區的 SQL Server 鎖存

  • October 6, 2017

我們正在 SQL Server 表中進行並行、多執行緒插入,並希望減少閂鎖。

利用散列分區來減少鎖存的缺點是什麼?從本質上查詢所有這些拆分的分區表是否降低了查詢速度?

我們每秒大約有 120 個表格插入,金融系統。

其他注意事項:SQL 2016 系統每年將使用大約 50 GB 的 SSD 硬碟空間。目前,擁有 50 個核心處理器和 150 GB 的 RAM。

平台沒有搭建,所以沒有基準測試;但我需要製定測試計劃和策略。

雜湊分區範例: http: //www.madeiradata.com/how-to-solve-the-tail-insert-problem-2/

CREATE PARTITION FUNCTION pf_hash (TINYINT) 
AS RANGE LEFT FOR VALUES (0,1,2,3,4,5,6,7,8);

CREATE PARTITION SCHEME ps_hash 
AS PARTITION pf_hash ALL TO ([PRIMARY]);

CREATE TABLE dbo.UserEntries_RegularWithHash 
(   
Id BIGINT IDENTITY NOT NULL,
UserId INT NOT NULL ,
CreatedDate DATETIME2 NOT NULL,
HashId AS CAST(Id % 9 AS TINYINT) PERSISTED NOT NULL,
CONSTRAINT PK_UserEntries_RegularWithHash 
PRIMARY KEY CLUSTERED (Id,HashId)
) 
ON ps_hash(HashId);

未指定分區列的查詢將需要觸及所有分區。對於使用計算雜湊列進行分區的表來說,這尤其是一個問題,因為查詢中通常不指定雜湊值。儘管您可以指定HashId值,但這樣做並不自然。例子:

--touches all 10 partitions
SELECT *
FROM dbo.UserEntries_RegularWithHash
WHERE Id = @Id;

--touches 1 partition
SELECT *
FROM dbo.UserEntries_RegularWithHash
WHERE Id = @Id
AND HashId = CAST(@Id % 9 AS TINYINT);

對具有增量鍵的非分區表的閂鎖爭用通常僅在非常高的插入率下發生。

在每秒 120 次插入的健康機器上不會發生閂鎖爭用。David Browne-Microsoft建議每秒 10,000 次插入是閂鎖爭用的問題。這可能是一個很好的 SWAG,因為它取決於行大小和硬體等因素。我認為可以假設在考慮閂鎖爭用之前需要每秒幾千個速率。此時,您可能會考慮記憶體中 OLTP 表和/或批量/批量插入。

我聽說過早優化是萬惡之源。在這種情況下,我當然不會僅僅為了避免閂鎖爭用而引入分區。

引用自:https://dba.stackexchange.com/questions/185661