1、循環語句的插入效率問題
爲循環插入語句的外圍增加一個顯示事務,會大幅度的提高循環插入的效率
eg1:
DECLARE @bdate DATETIME
DECLARE @edate DATETIME
SET NOCOUNT ON
DECLARE @i INT=1
DECLARE @q INT=500000
SET @bdate=GETDATE()
CREATE TABLE TEST_20190218
(
ID INT PRIMARY KEY,
NAME UNIQUEIDENTIFIER,
CREATEDATE DATETIME
)
WHILE @i<=@q
BEGIN
INSERT TEST_20190218
SELECT @i,NEWID(),GETDATE()
SET @i=@i+1
END
SET @edate =GETDATE()
SELECT '花費時間:'+CONVERT(NVARCHAR(20),DATEDIFF(MILLISECOND,@bdate,@edate))+'ms'
與
eg2:
DECLARE @bdate DATETIME
DECLARE @edate DATETIME
SET NOCOUNT ON
DECLARE @i INT=1
DECLARE @q INT=1000000
SET @bdate=GETDATE()
CREATE TABLE TEST_20190218_1
(
ID INT,
NAME UNIQUEIDENTIFIER,
CREATEDATE DATETIME
)
BEGIN TRAN
WHILE @i<=@q
BEGIN
INSERT TEST_20190218_1
SELECT @i,NEWID(),GETDATE()
SET @i=@i+1
END
COMMIT TRAN
SET @edate =GETDATE()
SELECT '花費時間:'+CONVERT(NVARCHAR(20),DATEDIFF(MILLISECOND,@bdate,@edate))+'ms'
eg2的速度遠高於eg1(當數據量逐漸增大的時候),本次實例爲50W條數據
同時,有趣的點,當被插入的表TEST當中不存在唯一鍵(主鍵)時,在事務循環插入之外,另外在執行插入語句,並不會遇到鎖表
但是當存在唯一鍵(主鍵)時,在事務循環插入之外,另外執行插入語句時,則會遇到事務鎖表情況,直到事務結束
2、使用臨時表和表變量的方式批量插入速度是不如單獨爲某個事務循環。
但是,臨時表和表變量的優點
循環過程中不會增加事務鎖,只在最後進行物理表寫入的時候,進行一次事務提交
是減少了對其他事務會話的影響,和受其他事務會話影響的程度。
提高了併發性