SQL 快速向表中插入100万条数据

来源:互联网 发布:mysql union order by 编辑:程序博客网 时间:2024/04/27 19:13
SET NOCOUNT ON;
02USE master;
03GO 
04----判断数据库TestDB是否存在,即创建数据库
05IF db_id('TestDB')IS NULL
06CREATE DATABASE TestDB
07GO
08USE TestDB
09GO
10---判断Nums 表是否存在,存在即将其删除
11IF OBJECT_ID('dbo.Nums')IS NOT NULL
12     DROPTABLE dbo.Nums;
13GO
14---重新创建表
15CREATE TABLE dbo.Nums(n intNOT NULL PRIMARY KEY);
16DECLARE @max AS int,@rc ASint;
17SET @max=1000000;
18SET @rc=1;
19   
20INSERT INTO dbo.Nums VALUES(1);
21WHILE @rc*2<=@max
22BEGIN
23INSERT INTO dbo.Nums   SELECTn+@rc FROM dbo.Nums;
24    SET@rc=@rc*2;
25    END   
26INSERT INTO dbo.Nums
27            SELECTn+@rc FROM dbo.Nums WHERE n+@rc<=@max;
28            GO

代码分析:

SET NOCOUNT ON:这是一个存储过程,当 SET NOCOUNT 为ON 时不返回计数(表示受Transact-SQL 语句影响的行数,即消息返回:命令已完成)。当SET NOCOUNT 为OFF 时返回计数((1 行受影响)(2 行受影响)(4 行受影响)(8 行受影响)(16 行受影响)....等等返回信息).如果存储过中包含的一些语句并不返回许多实际的数据,则该设置由于大量减小了网络流量,因些可以显著提高性能。

SET @max=1000000:为定义插入的最大值。这里我设其为100W。

view source
print?
1INSERT INTO dbo.Nums VALUES(1);
2WHILE @rc*2<=@max
3BEGIN
4INSERT INTO dbo.Nums SELECTn+@rc FROM dbo.Nums;
5    SET@rc=@rc*2;
6    END 
7INSERT INTO dbo.Nums
8            SELECTn+@rc FROM dbo.Nums WHERE n+@rc<=@max;
9            GO

以上这段代码为核心代码:

INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums:的意思是:在一个While循环中的,每执行一次都会向表dbo.nums 中插入一批数据,这批数据是表dbo.nums 中原有的数据,只是字段 n 的值是在原基础上增加了2 * @rc(@rc=1,2,3,执行次数) 图解:

点击查看大图

上图的算法就是描述这句SQL:INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums;?而 n+@rc 的值变化为 2的N次方(包括0次方)

当执行完:INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums; 时发现并没有100万条数据,然后 我们补充一句SQL语句:

INSERT INTO dbo.Nums SELECT n+@rc FROM dbo.Nums WHERE n+@rc<=@max; GO 这句的意思为:补全小于或等于 @max(100W);的所有数据。 执行以整个SQL语句时间可能需要几分钟,但总比一路for 的速度快吧?源码下载