Sqlserver——查詢技巧/優化方案——大批量插入的選擇(循環插入Or臨時表Or表變量插入)


         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、使用臨時表和表變量的方式批量插入速度是不如單獨爲某個事務循環。


             但是,臨時表和表變量的優點

             循環過程中不會增加事務鎖,只在最後進行物理表寫入的時候,進行一次事務提交

             是減少了對其他事務會話的影響,和受其他事務會話影響的程度。

             提高了併發性
                 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章