SQL2008使用CTE递归查询批量插入500万数据

原文 http://www.cnblogs.com/wjmo520/archive/2013/04/27/3046795.html

一直都使用一般的批量循环插入方法 ,可这效率也太慢了,插入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 语句中运行递归查询所需的代码。

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

时间: 2024-10-26 20:40:46

SQL2008使用CTE递归查询批量插入500万数据的相关文章

mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢。

问题描述 mysql(表:InnoDB,无索引),批量插入50万条记录后,越来越慢. 插入10000条,已用时0秒 插入20000条,已用时2秒 插入30000条,已用时3秒 插入40000条,已用时3秒 插入50000条,已用时4秒 插入60000条,已用时5秒 插入70000条,已用时6秒 插入80000条,已用时7秒 插入90000条,已用时8秒 插入100000条,已用时9秒 插入110000条,已用时11秒 插入120000条,已用时12秒 插入130000条,已用时13秒 插入140

使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解

SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常慢,几千条数据的写入或者更新可能需要好几分钟时间,而SqlServer则相同的操作可能几秒即可,有无更好的方法来提高它的响应速度呢?答案是有的,就是采用事务提交,默认SQLite的数据库插入操作,如果没有采用事务的话,它每次写入提交,就会触发一次事务操作,而这样几千条的数据,就会触发几千个事务的操作

Yii2 批量插入、更新数据实例

在使用yii2开发项目时,有时候会遇到这样的情况: 向后台发送多条数据,其中一些数据已经存在记录,只需要对其部分字段的值进行修改;而另一部分的数据则需要新添加进去. 这就需要对添加的数据进行判断,其中一些执行update,剩下的执行insert 代码如下,不对的地方请指教: //批量更新,并将需要批量插入的数据放入数组中 foreach($goods as $k => $v) { if(yourModel::updateAllCounters( ['goods_num' => $v], ['g

实例讲解Java批量插入、更新数据_java

Java的批量添加数据,多个字段同时添加多条数据,我不知道你遇到过没有.今天我们就以一个具体的实例来说一下Java的批量添加数据,面向的是Oracle数据库. 前台页面: <span style="font-size:14px;"><body class="main_body" scroll="no"> <div class="employee_gun_dong"> <form nam

Mysql批量插入和更新的性能

问题描述 利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不固定),循环3000次.每次在循环到100次左右的时候,会出现"com.jolbox.bonecp.ConnectionPartition - BoneCP detected an unclosed connection and will now attempt to close it f

SQLServer 批量插入数据的两种方法_MsSql

运行下面的脚本,建立测试数据库和表值参数. 复制代码 代码如下: --Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go --Create Table Valued CREATE TYPE BulkUdt A

SQLServer 批量插入数据的两种方法

运行下面的脚本,建立测试数据库和表值参数. 复制代码 代码如下: --Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go --Create Table Valued CREATE TYPE BulkUdt A

Mysql数据库实践操作之————批量插入数据(100万级别的数据)

第一种方法:使用insert into 插入 从Redis每次获取100条数据,根据条件去插入到Mysql数据库中: 条件: 如果当前队列中的值大于1000条,则会自动的条用该方法,该方法每次获取从队列的头部每次获取100掉数据插入到Mysql数据库中,同时以当前队列的长度为插入条件. 1000为原始数据,从队列头获取100条,插入到Mysql数据,同时删除已经插入的数据,再通过队列的长度判断是否继续插入,直到循环不满足条件为止. [1]获取头100条数据:$redis->lRange($liv

SQLSERVER中CTE语句结构及CTE递归查询

  SQL SERVER中CTE语句结构及CTE递归查询 CTE语句结构 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集.CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效.与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次. 使用上面的test4表为例: WITH TEST_CTE AS ( select * from test4 ) 此句创建了名为