有一個存儲過程:併發在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個線程的並行執行相同的程序,然後在第一個線程在1300毫秒內完成,最後 - 在6000毫秒內,平均值爲4800毫秒。 正如你所看到的,當其他線程執行完成時,線程等待的地方沒有鎖定。而且,服務器CPU的加載時間小於100%,即有足夠的資源來同時執行它們。那怎麼可能?
編輯:發現有關併發插入一個很好的文章: Resolving PAGELATCH Contention on Highly Concurrent INSERT Workloads
它似乎插入8次相同的東西。那是對的嗎?如果是這樣的話,在8行派生表上進行笛卡爾連接會更快(或者這只是一個用於測試的演示)? – 2010-06-15 15:30:01
感謝您的評論,問題不在於代碼性能,而在於併發性:爲什麼當10個線程執行這個簡單的過程時,它似乎被阻塞了? (完全是一個演示) – Tim 2010-06-15 15:32:54
@tim - 你有沒有嘗試過在'sys.dm_os_wait_stats'上看到什麼是等待?注意:爲了在測試之前清除這個問題,你可以做'DBCC SQLPERF(「sys.dm_os_wait_stats」,CLEAR)' – 2010-06-15 15:41:08