整容说文库 > 程序代码 > 教育资讯

求一SQL语句,插入300W条测试数据。速度要快

来源:学生作业帮助网 编辑:整容说文库 时间:2020/12/01 22:47:26 程序代码
求一SQL语句,插入300W条测试数据。速度要快程序代码
shanghaihaizi 于 2010-01-27 02:28:02 编辑 准备测试自己的程序,
准备向 3个表各插入100W条数据

表1         表2         表3
------------------------------
字段A     字段D        字段F
字段B     字段E
字段C

求这个SQL语句,速度要快
期待高手
数据类型不考虑
insert into 表1 values 字段A 字段D 字段F 字段B 字段E 字段C 
引用 2 楼 chuxiaoyun 的回复:
insert into 表1 values 字段A 字段D 字段F 字段B 字段E 字段C

我没写清楚? 哥们3个表呢
再有,你的方法插完数据我也休克了
天亮了,高手起床了,开始扫贴了
bcp 批量导入导出!
从哪导入呢?
我是测试数据,都是随机生成的。
测试数据是怎么生成的呢?一般测试数据不是保存在txt或其他文件里,然后在导入的吗?你这个测试数据如果是生成一条,插入一条。。。那就不能批量导入
up
循环插入: 



  



DECLARE @MyCounter INT 



SET @MyCounter = 0            /*设置变量*/ 



WHILE (@MyCounter < 2)     /*设置循环次数*/ 



BEGIN 



WAITFOR DELAY '000:00:10'   /*延迟时间10秒*/ 



INSERT INTO time_by_day 



      (time_id, the_date, the_year, month_of_year, quarter, day_of_month) 



SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1) 



      AS the_year, MONTH(the_date + 1) AS month_of_year, { fn QUARTER(the_date + 1) 



      } AS quarter, DAY(the_date + 1) AS day_of_month 



FROM time_by_day 



ORDER BY time_id DESC 





SET @MyCounter = @MyCounter + 1 



END 





4,插入以时间为变量的数据 





DECLARE @MyCounter INT 



declare @the_date datetime 



SET @MyCounter = 0 



SET @the_date = '1999-1-4' 



WHILE (@MyCounter < 200000) 



BEGIN 



WAITFOR DELAY '000:00:10' 



/*INSERT INTO time_by_day 



      (time_id, the_date, the_year, month_of_year, quarter, day_of_month) 



SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1) 



      AS the_year, MONTH(the_date + 1) AS month_of_year, { fn QUARTER(the_date + 1) 



      } AS quarter, DAY(the_date + 1) AS day_of_month 



FROM time_by_day 



ORDER BY time_id DESC 



*/ 



insert into time_by_day (time_id,the_date)values('371',@the_date) 



SET @the_date = @the_date + 1 



SET @MyCounter = @MyCounter + 1 



END 
数据哪来的?凭空生成?
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(COL1 VARCHAR(50),COL2 VARCHAR(50),COL3 VARCHAR(50))
INSERT INTO TB
SELECT TOP 1000000 NEWID(),NEWID(),NEWID()
FROM MASTER..SPT_VALUES T1
INNER JOIN MASTER..SPT_VALUES T2 ON 1=1
INNER JOIN MASTER..SPT_VALUES T3 ON 1=1
--1分28秒
我发现一个问题 一般 CSDN 有好几个星星的ID ,CSDN 时时在线 ,呵呵
select a.name,a.column_id,a.system_type_id  into #t
from sys.columns a, sys.columns b,sys.columns c
引用 10 楼 guguda2008 的回复:
数据哪来的?凭空生成?
SQL codeIFOBJECT_ID('TB')ISNOTNULLDROPTABLE TBGOCREATETABLE TB(COL1VARCHAR(50),COL2VARCHAR(50),COL3VARCHAR(50))INSERTINTO TBSELECTTOP1000000NEWID(),NEWID(),NEWID()FROM MASTER..SPT_VALUES T1INNERJOIN MASTER..SPT_VALUES T2ON1=1INNERJOIN MASTER..SPT_VALUES T3ON1=1--1分28秒

鸭子试试select into
据说比insert into 快 呵呵你测一下 告诉我
SELECT  checksum(newid())
FROM syscolumns c1, syscolumns c2, syscolumns c3


引用 9 楼 fredrickhu 的回复:
SQL code循环插入:DECLARE@MyCounterINTSET@MyCounter=0/*设置变量*/WHILE (@MyCounter<2)/*设置循环次数*/BEGINWAITFOR DELAY'000:00:10'/*延迟时间10秒*/INSERTINTO time_by_day 



      (time_id, the_date, the_year, month_of_ye?-


你这个插入第一个表耗时多长?
引用 13 楼 beirut 的回复:
引用 10 楼 guguda2008 的回复:
数据哪来的?凭空生成?
SQL codeIFOBJECT_ID('TB')ISNOTNULLDROPTABLE TBGOCREATETABLE TB(COL1VARCHAR(50),COL2VARCHAR(50),COL3VARCHAR(50))INSERTINTO TBSELECTTOP1000000NEWID(),NEWID(),NEWID()FROM MASTER..SPT_VALUES T1INNERJOIN MASTER..SPT_VALUES T2ON1=1INNERJOIN MASTER..SPT_VALUES T3ON1=1--1分28秒

鸭子试试select into
据说比insert into 快 呵呵你测一下 告诉我


SQL 一般总是完整 的记录修改操作,但是对数据库恢复模式不是FULL而且执行的是BULK操作的时候,它总是以最小的方式记录.BULK操作包括:创建和重新生产索引,使用BULK引起插入,select into ,LOB(大型对象)的操作.
设计插入时候:先考虑BULK操作;再考虑基于集合的多行INSERT(insert select );最后才选择单行的INSERT 。

所以你的假设是对的 
随机生成 再快。也快不到哪里去。

看你这三百万数据从何而来。。

如果是连续的100W 下面2个方法 其中第二种要快 而且灵活 
/*
生产一百万连续数据之临时表
*/
SET NOCOUNT ON 
CREATE TABLE NUM(N INT PRIMARY KEY)
INSERT NUM VALUES(1);
DECLARE @MAX INT,@RC INT
SET @MAX=1000000
SET @RC=1
WHILE @RC*2<=@MAX
BEGIN
INSERT NUM 
SELECT N+@RC FROM NUM
SET @RC=@RC*2
END
INSERT NUM 
SELECT N+@RC FROM NUM WHERE N+@RC<=@MAX
SELECT * FROM NUM
go
-----------------
/*
函数生产100W连续数据
*/
create function dbo.fn_nums(@n as bigint )
returns table
as

 return 
 with 
 L0 as (select 1 as c union all select 1),
 L1 as (select 1 as c from L0 AS A,L0 AS B),
 L2 AS (SELECT 1 AS C FROM L1 AS A,L1 AS B),
 L3 AS (SELECT 1 AS C FROM L2 AS A,L2 AS B),
 L4 AS (SELECT 1 AS C FROM L3 AS A,L3 AS B),
 L5 AS (SELECT 1 AS C FROM L4 AS A,L4 AS B),
 NUMS AS (SELECT ROw_number() over (order by c) as n from L5)
 select n from nums where n<=@n

select * from dbo.fn_nums(1000000)


datafactory Version5.6
引用 19 楼 feixianxxx 的回复:
如果是连续的100W 下面2个方法 其中第二种要快 而且灵活
SQL code/*
生产一百万连续数据之临时表*/SET NOCOUNTONCREATETABLE NUM(NINTPRIMARYKEY)INSERT NUMVALUES(1);DECLARE@MAXINT,@RCINTSET@MAX=1000000SET@RC=1WHILE@RC*2<=@MAXBEGININSERT NUMSELECT N+@RCFROM NUMSET@RC=@RC*2ENDINSERT NUMSELECT N+@RCFROM NUMWHERE N+@RC<=@MAXSELECT*FROM NUMgo-----------------
/*
函数生产100W连续数据*/createfunction dbo.fn_nums(@nasbigint )returnstableasreturnwith 
 L0as (select1as cunionallselect1),
 L1as (select1as cfrom L0AS A,L0AS B),
 L2AS (SELECT1AS CFROM L1AS A,L1AS B),
 L3AS (SELECT1AS CFROM L2AS A,L2AS B),
 L4AS (SELECT1AS CFROM L3AS A,L3AS B),
 L5AS (SELECT1AS CFROM L4AS A,L4AS B),
 NUMSAS (SELECT ROw_number()over (orderby c)as nfrom L5)select nfrom numswhere n<=@nselect*from dbo.fn_nums(1000000)

好熟悉
引用 21 楼 beirut 的回复:
引用 19 楼 feixianxxx 的回复:
如果是连续的100W 下面2个方法 其中第二种要快 而且灵活
SQL code/*
生产一百万连续数据之临时表*/SET NOCOUNTONCREATETABLE NUM(NINTPRIMARYKEY)INSERT NUMVALUES(1);DECLARE@MAXINT,@RCINTSET@MAX=1000000SET@RC=1WHILE@RC*2 <=@MAXBEGININSERT NUMSELECT N+@RCFROM NUMSET@RC=@RC*2ENDINSERT NUMSELECT N+@RCFROM NUMWHERE N+@RC <=@MAXSELECT*FROM NUMgo-----------------
/*
函数生产100W连续数据*/createfunction dbo.fn_nums(@nasbigint )returnstableasreturnwith
L0as (select1as cunionallselect1),
L1as (select1as cfrom L0AS A,L0AS B),
L2AS (SELECT1AS CFROM L1AS A,L1AS B),
L3AS (SELECT1AS CFROM L2AS A,L2AS B),
L4AS (SELECT1AS CFROM L3AS A,L3AS B),
L5AS (SELECT1AS CFROM L4AS A,L4AS B),
NUMSAS (SELECT ROw_number()over (orderby c)as nfrom L5)select nfrom numswhere n <=@nselect*from dbo.fn_nums(1000000)



好熟悉

(*^__^*) 嘻嘻…… 
你看了几本了
引用 22 楼 feixianxxx 的回复:
引用 21 楼 beirut 的回复:
引用 19 楼 feixianxxx 的回复:
如果是连续的100W 下面2个方法 其中第二种要快 而且灵活
SQL code/*
生产一百万连续数据之临时表*/SET NOCOUNTONCREATETABLE NUM(NINTPRIMARYKEY)INSERT NUMVALUES(1);DECLARE@MAXINT,@RCINTSET@MAX=1000000SET@RC=1WHILE@RC*2 <=@MAXBEGININSERT NUMSELECT N+@RCFROM NUMSET@RC=@RC*2ENDINSERT NUMSELECT N+@RCFROM NUMWHERE N+@RC <=@MAXSELECT*FROM NUMgo-----------------
/*
函数生产100W连续数据*/createfunction dbo.fn_nums(@nasbigint )returnstableasreturnwith
L0as (select1as cunionallselect1),
L1as (select1as cfrom L0AS A,L0AS B),
L2AS (SELECT1AS CFROM L1AS A,L1AS B),
L3AS (SELECT1AS CFROM L2AS A,L2AS B),
L4AS (SELECT1AS CFROM L3AS A,L3AS B),
L5AS (SELECT1AS CFROM L4AS A,L4AS B),
NUMSAS (SELECT ROw_number()over (orderby c)as nfrom L5)select nfrom numswhere n <=@nselect*from dbo.fn_nums(1000000)


好熟悉


(*^__^*) 嘻嘻……
你看了几本了

没看多少,刚买回来没有多久,白天没时间,晚上就一小会 哈哈
技术内幕上有相关内容?我还没看前两本呢
引用 24 楼 guguda2008 的回复:
技术内幕上有相关内容?我还没看前两本呢

那两个是他原搬下来的
但是表变量里存100W的数据有什么用?没有索引操作100W数据不得累死
引用 26 楼 guguda2008 的回复:
但是表变量里存100W的数据有什么用?没有索引操作100W数据不得累死

你不会把它变成实体表,再数据库里建一个连续数据的实体表会很方便的
比如就可以不用spt_values了。也可以打破它的局限性
sqlserver 的话 用bcp吧,速度较快

100W条20多秒吧
程序代码