SQL2008使用CTE遞歸查詢批量插入500萬數據


一直都使用一般的批量循環插入方法 ,可這效率也太慢了,插入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 語句中運行遞歸查詢所需的代碼。

小記一下 回去再研究研究 下班!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM