首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程/并行插入和散列分区中的Server锁存

多线程/并行插入和散列分区中的Server锁存
EN

Database Administration用户
提问于 2017-09-12 03:33:36
回答 1查看 833关注 0票数 2

我们正在SQL服务器表中执行并行多线程插入,并希望减少锁存。

利用哈希分区来减少锁存的缺点是什么?它是否降低了查询所有这些拆分的分区表的查询速度?

我们有大约120表插入每秒,金融系统。

其他注释: SQL 2016系统每年将使用大约50 GB的SSD硬盘空间。目前,有50个核心处理器,150 GB内存。

平台没有构建,所以没有基线来测试;但是我需要制定测试计划和策略。

散列分区示例:http://www.madeiradata.com/how-to-solve-the-tail-insert-problem-2/

代码语言:javascript
复制
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);
EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-09-12 12:11:14

没有指定分区列的查询将需要访问所有分区。这尤其是使用计算哈希列对表进行分区的问题,因为哈希值通常不是在查询中指定的。虽然可以指定HashId值,但这样做是不自然的。示例:

代码语言:javascript
复制
--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表和/或批量/批处理插入。

我听说过,过早的优化是万恶之源。在这种情况下,我当然不会引入分区仅仅是为了避免闩锁争用。

票数 7
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/185661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档