我们正在SQL服务器表中执行并行多线程插入,并希望减少锁存。
利用哈希分区来减少锁存的缺点是什么?它是否降低了查询所有这些拆分的分区表的查询速度?
我们有大约120表插入每秒,金融系统。
其他注释: SQL 2016系统每年将使用大约50 GB的SSD硬盘空间。目前,有50个核心处理器,150 GB内存。
平台没有构建,所以没有基线来测试;但是我需要制定测试计划和策略。
散列分区示例: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);发布于 2017-09-12 12:11:14
没有指定分区列的查询将需要访问所有分区。这尤其是使用计算哈希列对表进行分区的问题,因为哈希值通常不是在查询中指定的。虽然可以指定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次插入的速度在健康的机器上发生。大卫·布朗-微软建议每秒10,000个插入是锁存争用的关注点。这可能是个不错的选择,因为它将取决于诸如行大小和硬件等因素。我认为,在考虑锁存争用之前,可以假设每秒需要几千个速率。此时,您可能会考虑内存中的OLTP表和/或批量/批处理插入。
我听说过,过早的优化是万恶之源。在这种情况下,我当然不会引入分区仅仅是为了避免闩锁争用。
https://dba.stackexchange.com/questions/185661
复制相似问题