snippetsqlMajor
Generate and Insert 1 million rows into simple table
Viewed 0 times
millionrowssimpleinsertintogenerateandtable
Problem
Description:
I try to insert 1 million rows into empty table on MSSQL 2012 Express.
Here my script:
Question:
After researching , I found 4 solutions. Are there any better solution (not using copy data from files) ?
I try to insert 1 million rows into empty table on MSSQL 2012 Express.
Here my script:
-- set statistics time off
drop table t1
create table t1 (id int, a text, b text)
go
-- #1 - 1,000,000 - 30s -> 45s
with ID(number) as
(
select 1 as number
union all
select number + 1
from ID
where number ~140,000 rows = 120s (have to cancel query)
declare @count int
set @count = 0
while @count 20s
with temp as
(
SELECT ROW_NUMBER() OVER(ORDER BY a.object_id) as tcount
from sys.all_columns a, sys.all_columns b
where a.object_id = b.object_id
)
insert into t1
select tcount, 'a_' + cast (tcount as varchar), 'b_' + cast (tcount/2 as varchar)
from temp
go
declare @count int
set @count = 0
while @count 4s (have to drop t1 first)
with a(k) as
(
select 1 as k
union all
select k + 1 from a where k < 99 + 1
) ,
t2 as (
select row_number() over(order by x.k) as k
from a x , a y , a z
)
select k as id , 'a_' + cast (k as varchar) as a, 'b_' + cast (k/2 as varchar) as b into t1
from t2Question:
After researching , I found 4 solutions. Are there any better solution (not using copy data from files) ?
Solution
Itzik Ben-Gan uses following approach
This is probably the fastest way he found and he's quite smart :-)
This is probably the fastest way he found and he's quite smart :-)
WITH
L0 AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)), -- 2^1
L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B), -- 2^2
L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B), -- 2^4
L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B), -- 2^8
L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B), -- 2^16
L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B), -- 2^32
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS k FROM L5)
select k as id , 'a_' + cast (k as varchar) as a, 'b_' + cast (k/2 as varchar) as b into t1
from nums
where k <= 1000000Code Snippets
WITH
L0 AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)), -- 2^1
L1 AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B), -- 2^2
L2 AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B), -- 2^4
L3 AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B), -- 2^8
L4 AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B), -- 2^16
L5 AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B), -- 2^32
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS k FROM L5)
select k as id , 'a_' + cast (k as varchar) as a, 'b_' + cast (k/2 as varchar) as b into t1
from nums
where k <= 1000000Context
StackExchange Database Administrators Q#130392, answer score: 21
Revisions (0)
No revisions yet.