儘量不要用 global temp table

測試的預存程序如下:

USE Northwind
GO
CREATE PROC spTest @i INT
AS
SET NOCOUNT ON
/*
如果沒有交易的話,後執行的連接都會出現
Msg 2714, Level 16, State 6, Server INSTRUCTOR, Procedure spTest, Line 6
There is already an object named ‘##t’ in the database.
*/
BEGIN TRAN
    DECLARE @j INT=0
    CREATE TABLE ##t(c1 int,c2 char(1000))
    WHILE @j<@i
    BEGIN
        INSERT ##t values(@i,REPLICATE(CHAR(65 + @i%26),1000))
        SET @j+=1
    END
    DROP TABLE ##t
COMMIT TRAN
PRINT ‘OK ‘ + CONVERT(NVARCHAR(100),SYSDATETIME())
GO
–exec spTest 100

測試的批次命令如下

start sqlcmd -E -d Northwind -Q "exec spTest 300000" -o Res1.txt
start sqlcmd -E -d Northwind -Q "exec spTest 300000" -o Res2.txt
start sqlcmd -E -d Northwind -Q "exec spTest 300000" -o Res3.txt
start sqlcmd -E -d Northwind -Q "exec spTest 300000" -o Res4.txt

一執行後全部被鎖起來,只有一條連接可以執行,所以僅有一個 CPU 滿載

image

查詢鎖定狀況

image

use tempdb
select OBJECT_NAME(34)

知道是 sys.sysschobjs 系統資料表,會記載暫存物件,所以大家都在等待更動系統資料表,以更動(刪/增) global temp table 的該筆記錄

若改成 local temp table 則沒此問題

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: