我在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
)
答案 0 :(得分:0)
好吧,如果GUID不是群集密钥 - 该表上的群集密钥是什么?它应该有一个 - 一个精心挑选的集群密钥加速操作 - 甚至插入和删除!请参阅Kimberly Tripp的博客文章The Clustered Index Debate Continues...,以获得更好的解释和更多背景信息。
当你阅读Kim Tripp的博文和她关于这个主题的所有其他文章时,很明显一个好的聚类键是狭窄的,独特的,静态的和不断增加的 - 完美适合{ {1}}或INT
标识列。
早期版本的SQL Server(2000年或2005年之前)确实有插入热点如果所有插入都发生在一个地方 - 那些负面影响已被删除,那些不再是一个问题,因此,使用BIGINT
列作为聚类键是大多数情况下的最佳选择。
答案 1 :(得分:0)
一行16秒太多了。从这个问题的数量级来判断,这不是坏索引键或索引太多的问题。所有这一切都在毫秒范围内。调查实际的执行计划。您还可以使用SQL事件探查器来跟踪正在执行的内容以及执行的时间。等待和阻止也可能是这么长时间的原因。