Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 sqlserver2008中的并发性_Sql Server 2008 - Fatal编程技术网

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是一个合理的假设,以前没有考虑到这一点,现在看起来它描述了原因。