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'

      Sqlserver——查询技巧/优化方案——大批量插入的选择(循环插入Or临时表Or表变量插入)_第1张图片
            与

            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'

Sqlserver——查询技巧/优化方案——大批量插入的选择(循环插入Or临时表Or表变量插入)_第2张图片
            eg2的速度远高于eg1(当数据量逐渐增大的时候),本次实例为50W条数据
            同时,有趣的点,当被插入的表TEST当中不存在唯一键(主键)时,在事务循环插入之外,另外在执行插入语句,并不会遇到锁表
            但是当存在唯一键(主键)时,在事务循环插入之外,另外执行插入语句时,则会遇到事务锁表情况,直到事务结束
  2、使用临时表和表变量的方式批量插入速度是不如单独为某个事务循环。

Sqlserver——查询技巧/优化方案——大批量插入的选择(循环插入Or临时表Or表变量插入)_第3张图片
             但是,临时表和表变量的优点

             循环过程中不会增加事务锁,只在最后进行物理表写入的时候,进行一次事务提交

             是减少了对其他事务会话的影响,和受其他事务会话影响的程度。

             提高了并发性
                 

你可能感兴趣的:(Sqlserver——查询技巧/优化方案——大批量插入的选择(循环插入Or临时表Or表变量插入))