Sql server 2008 sqlserver2008中的并发性
有一个存储过程:Sql server 2008 sqlserver2008中的并发性,sql-server-2008,Sql Server 2008,有一个存储过程: CREATE PROCEDURE [dbo].[TestProc] AS BEGIN SET NOCOUNT ON; create table #thistable (rid char(32)) insert into #thistable(rid) select A0RID from tblCdbA0 with (nolock) END 单独执行该过程需要400-500毫秒,但当10个线程并行执行同一过程时,第一个线程在
CREATE PROCEDURE [dbo].[TestProc]
AS
BEGIN
SET NOCOUNT ON;
create table #thistable (rid char(32))
insert into #thistable(rid)
select A0RID from tblCdbA0 with (nolock)
END
单独执行该过程需要400-500毫秒,但当10个线程并行执行同一过程时,第一个线程在1300毫秒内完成,最后一个线程在6000毫秒内完成,平均为4800毫秒。
正如您所看到的,当其他finish执行时,线程等待的地方没有锁定。此外,服务器CPU的负载低于100%,即有足够的资源同时执行它们。怎么可能呢
编辑:找到一篇关于并发插入的好文章:
为什么要从同一个表中选择8次,只要在第一次获得行时复制它们,请尝试以下操作:
CREATE PROCEDURE [dbo].[TestProc]
AS
SET NOCOUNT ON;
create table #thistable (rid char(32))
;WITH AllNumbers AS
(
SELECT 1 AS Number
UNION ALL
SELECT Number+1
FROM AllNumbers
WHERE Number<8
)
insert into #thistable
(rid)
select A0RID
from tblCdbA0 t with (nolock)
INNER JOIN AllNumbers a ON 1=1
RETURN 0
GO
如果使用联合,则每个线程有8次表扫描,这将增加并影响性能。首先,CPU不是数据库中唯一的资源。您发布的查询将插入tempdb中的temp表,这将需要以下资源: tempdb SGAM/GAM分配。 tempdb日志 缓冲池 tempdb IO 因此,如果一个线程有400-500毫秒,而10个线程在6000毫秒内完成,我并不感到惊讶。您需要10倍以上的工作,即10倍以上的IO将这些临时表写入磁盘,因此预计需要4000-5000毫秒。额外的1000毫秒可能来自争夺同一资源的争用线程
最后,您需要测量所花费的时间,请参阅,以获取分析问题的良好方法。似乎要将相同的内容插入8次。对吗?如果是这样的话,在8行派生表上进行笛卡尔连接可能会更快,或者这只是一个用于测试的演示?感谢您的评论,问题不在于代码性能,而在于并发性:为什么当10个线程执行这个简单过程时,它似乎被阻塞了?确切地说,这是一个demo@tim-您是否尝试过在sys.dm_os_wait_stats上点击鼠标查看等待时间?注意:要在测试前清除此问题,可以执行DBCC SQLPERFsys.dm_os_wait_stats,CLEAR@Martin,乍一看,似乎很难过滤出这10个线程发出的锁。@tim-我怀疑这是一个锁问题。I/O将是我的第一个想法。c、 谢谢你的评论,基本上代码只是一个演示,它的性能本身并不有趣。问题是并发的。@Tim,在你的问题中,你引用了特定的执行时间并给出了一个特定的奇怪的查询,但你还要求别的什么?也许你需要修改你的问题,但我不确定你想要什么。也许你想要的是一些不太具体的东西,比如@Remus Rusanu的答案。如果是这样的话,您真的希望SQL Server拥有无限的读/写带宽来同时处理每个线程的所有IO吗?如果我大胆猜测,我会说限制因素是日志刷新速度。一个线程需要400-500毫秒,因为这是将插入的数据写入LDF文件所需的时间,并且只有在磁盘上强化提交日志后,语句才能返回。所以10个线程写10倍的数据,需要10倍的时间。这个评论看起来是合理的假设,有没有一种方法可以避免写日志来检查它?在任何情况下,服务器不能并行写入日志都有点奇怪。当然,服务器确实并行写入日志:但如果您的HDD的最大传输速率为130Mb/秒,这是消费类驱动器的通常最大/完美传输速率,那么一个查询将使用所有130Mb/秒,10个线程将共享它,每个线程的速度大约为13Mb/秒。我想你不明白。如果您的硬件只能每秒写入130MB,那么必须写入70MB的操作将需要400ms。10个操作需要写入700MB,需要4个操作。您必须增加瓶颈的大小,例如为您的HDD轴添加多个RAID 0轴。你根本不可能让9个女人在一个月内生下一个孩子……你是如何推断出我不明白的:不管怎样,IO是一个合理的假设,以前没有考虑到这一点,现在看起来它描述了原因。