use tempdb
goif object_id('tempdb..#tmp') is not null
drop table #tmp
gocreate table #tmp(
id bigint identity(1,1) primary key,
n nvarchar(max) )go
set nocount on
declare @i int,@imax int
set @imax=10000000
while 1=1
begin
select @i=count(1) from #tmp
print @i
if @i>=@imax
begin
break;
endif @i=0
begin
insert into #tmp (n) values(n'***************')
endif @i<=@imax/2
begin
insert into #tmp (n)
select n from #tmp
endelse
begin
insert into #tmp (n)
select top( @imax-@i ) n from #tmp
endend-- 1000 萬資料也就 2 分 13 秒
-- insert into #tmp(n) values('***x') go 10000000 這種方式雖然寫法簡單,但相當於迴圈一條條地插,效率不高。
——————————————————————————— 分割線 ——————————————————————————
另外也可以用 cte 來做, 雖然慢一點, 但勝在寫法簡單吧:
下面是兩種寫法實現同樣功能的對比:
迴圈:28秒
if object_id('tmp') is not null drop table tmp
gocreate table tmp(id bigint not null primary key)
goset nocount on
declare @i int,@imax int
set @imax=10000000
insert into tmp (id) values(1)
while 1=1
begin
select @i=max(id) from tmp
if @i<=@imax/2
begin
insert into tmp (id)
select @i+id from tmp order by id
endelse
begin
insert into tmp (id)
select top( @imax-@i ) @i+id from tmp order by id
break;
endend
cte: 2分25秒
if object_id('dbo.spt_values') is not null
drop table dbo.spt_values
gocreate table dbo.spt_values(
id int not null primary key )go
;with seq(id) as (
select 1
union all
select id + 1
from seq
where id < 10000000
) insert into dbo.spt_values(id)
select * from seq as s
option(maxrecursion 0)
快速生成大量測試資料
sql是利用了oracle資料庫語法的幾個實用小技巧實現的 1 利用oracle特有的 connect by 樹形連線語法生成測試記錄,level 10 表示要生成10記錄 2 利用rownum虛擬列生成遞增的整數資料 3 利用sysdate函式加一些簡單運算來生成日期資料,本例中是每條記錄的時間加...
oracle索引 快速生成大量測試資料
1.建立索引 create index on tablespace 2.刪除索引 drop index3.重置索引 alter index rebuild4.索引特點第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,...
構造大量測試資料的方法(MySql)
建立測試表 create table sys user id char 32 not null default comment 主鍵 username varchar 100 not null default comment 使用者名稱 password char 32 not null defau...