一直都使用一般的批量循環插入方法 ,可這效率也太慢了,插入500萬條數據執行所需的時間遠遠超過10分鍾。於是度娘了一下 發現可以使用CTE進行遞歸循環插入
以下是親測的數據:
1、創建表:
CREATE TABLE Customers (CustomerID INT primary key identity(1,1), CustomerNumber CHAR(4), CustomerName VARCHAR(50), CustomerCity VARCHAR(20)) GO
2、使用一般批量循環處理
/*使用一般的批量循環插入*/ declare @maxSum int, @customernum nvarchar(50), @customername nvarchar(50), @city nvarchar(50), @paytime datetime set @maxSum=1 set @customernum='0000' set @customername='Customer 0' set @city='X-City' while @maxSum<5000000 /*一般方法循環插入500萬條數據 10分鍾以上*/ begin insert into Customers (CustomerNumber,CustomerName,CustomerCity) values(@customernum,@customername,@city) set @maxSum=@maxSum+1 end select [500萬數據量插入完畢,共花費時間(毫秒)]=datediff(ms,@paytime,getdate())
結果:(10分鍾已過 還沒添加完畢...)
3、使用CTE方法
/*使用CTE遞歸循環插入 運用CTE遞歸插入,速度較快*/ TRUNCATE table Customers GO DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE SET STATISTICS IO ON; SET STATISTICS TIME ON; GO DECLARE @d Datetime SET @d=getdate(); WITH Seq (num,CustomerNumber, CustomerName, CustomerCity) AS (SELECT 1,'0000','Customer 0',cast('X-City' as NVARCHAR(20)) UNION ALL SELECT num + 1,'0000','Customer 0', cast(CHAR(65 + (num % 26)) + '-City' AS NVARCHAR(20)) FROM Seq WHERE num <= 5000000 /*CTE批量遞歸500萬數據量 用時一般大概3分鍾 因個人電腦而已*/ ) INSERT INTO Customers (CustomerNumber, CustomerName, CustomerCity) SELECT CustomerNumber, CustomerName, CustomerCity FROM Seq OPTION (MAXRECURSION 0) select [500萬數據量插入完畢,共花費時間(毫秒)]=datediff(ms,@d,getdate()) SET STATISTICS IO OFF ; SET STATISTICS TIME OFF; GO
結果:(185秒 約3分鍾左右)
網上也查了一下 說:CTE其實是面向對象的,運行的基礎是CLR。看來遞歸 CTE 可以極大地簡化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句中運行遞歸查詢所需的代碼。
小記一下 回去再研究研究 下班!