并发插入到具有非群集GUID主键的表中

时间:2015-10-20 08:07:28

标签: sql-server blocking

我在Microsoft SQL Server 2012上有这个表:

"b"

其中有3.362.817条记录。

我们的应用程序使用来自队列的消息,其中有10个并发消费者。每个使用者使用以下语句在该表中插入一行:

"abce"

查看统计数据,此查询的平均已用时间为16秒,这显然太过分了。

我想知道这是因为堆表如何处理如here所述的插入,或者您是否有任何想法导致这种情况?

我尝试将PK更改为群集,但没有任何明显的性能改进。

始终使用以下方法执行对表的查询:

CREATE TABLE [dbo].[Addresses_line_format]
(
    address_id UNIQUEIDENTIFIER NOT NULL
        CONSTRAINT pk_addresses_line_format PRIMARY KEY NONCLUSTERED,

    country_id UNIQUEIDENTIFIER NOT NULL
        CONSTRAINT fk_address_single_line_country FOREIGN KEY REFERENCES Countries (country_id)
            ON UPDATE NO ACTION
            ON DELETE NO ACTION,

    address_line NVARCHAR(255) NOT NULL,
    district_line NVARCHAR(255) NOT NULL
)

2 个答案:

答案 0 :(得分:0)

好吧,如果GUID不是群集密钥 - 该表上的群集密钥是什么?它应该有一个 - 一个精心挑选的集群密钥加速操作 - 甚至插入和删除!请参阅Kimberly Tripp的博客文章The Clustered Index Debate Continues...,以获得更好的解释和更多背景信息。

当你阅读Kim Tripp的博文和她关于这个主题的所有其他文章时,很明显一个好的聚类键是狭窄的,独特的,静态的和不断增加的 - 完美适合{ {1}}或INT标识列。

早期版本的SQL Server(2000年或2005年之前)确实有插入热点如果所有插入都发生在一个地方 - 那些负面影响已被删除,那些不再是一个问题,因此,使用BIGINT列作为聚类键是大多数情况下的最佳选择。

答案 1 :(得分:0)

一行16秒太多了。从这个问题的数量级来判断,这不是坏索引键或索引太多的问题。所有这一切都在毫秒范围内。调查实际的执行计划。您还可以使用SQL事件探查器来跟踪正在执行的内容以及执行的时间。等待和阻止也可能是这么长时间的原因。