博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

快速插入100W唯一数字的几种方案

Posted on 2010-11-26 09:22  linFen  阅读(667)  评论(0编辑  收藏  举报
--1.while循环 
 
declare @i as int 
set @i = 0 
 
while(@i < 1000000
begin  
insert into numbers values(@i) 
 set @i =@i+ 1 
end  
 
--极度慢 
 
--2.6表卡迪尔 
 
DECLARE @t TABLE  

  NUMBER INT 

 
INSERT INTO @t 
SELECT 0 
UNION ALL 
SELECT 1 
UNION ALL 
SELECT 2 
UNION ALL 
SELECT 3 
UNION ALL 
SELECT 4 
UNION ALL 
SELECT 5 
UNION ALL 
SELECT 6 
UNION ALL 
SELECT 7 
UNION ALL 
SELECT 8 
UNION ALL 
SELECT 9 
 
INSERT INTO numbers 
SELECT t1.NUMBER + t2.NUMBER * 10 + t3.NUMBER * 100 + t4.NUMBER * 1000 + t5.NUMBER * 10000 + t6.NUMBER * 100000 
FROM   @t AS t1, 
       @t AS t2, 
       @t AS t3, 
       @t AS t4, 
       @t AS t5, 
       @t AS t6  
 
--测试脚本 
 
-------------------------------------------------------------------------- 
 
 
DECLARE @beginTime DATETIME 
 
SET @beginTime=Getdate() 
--------------------------------- 
SET STATISTICS IO ON 
 
DECLARE @t TABLE ( 
  NUMBER INT ) 
 
INSERT INTO @t 
SELECT 0 
UNION ALL 
SELECT 1 
UNION ALL 
SELECT 2 
UNION ALL 
SELECT 3 
UNION ALL 
SELECT 4 
UNION ALL 
SELECT 5 
UNION ALL 
SELECT 6 
UNION ALL 
SELECT 7 
UNION ALL 
SELECT 8 
UNION ALL 
SELECT 9 
 
INSERT INTO numbers 
SELECT t1.NUMBER + t2.NUMBER * 10 + t3.NUMBER * 100 + t4.NUMBER * 1000 + t5.NUMBER * 10000 + t6.NUMBER * 100000 
FROM   @t AS t1, 
       @t AS t2, 
       @t AS t3, 
       @t AS t4, 
       @t AS t5, 
       @t AS t6 
 
-------------------------------- 
SELECT Datediff(ms, @beginTime, Getdate()) AS [Time(ms)] 
 
SET STATISTICS IO off 
TRUNCATE TABLE numbers  
 
 
---强行释放内存,清除缓冲区数据 
 
DBCC FREEPROCCACHE  
DBCC FREESESSIONCACHE  
DBCC FREESYSTEMCACHE('All')  
DBCC DROPCLEANBUFFERS  
 
exec sp_configure 'max server memory', 128  
EXEC ('RECONFIGURE' ) 
 
WAITFOR DELAY '00:00:03
 
EXEC  sp_configure 'max server memory', 2147483647  
EXEC ('RECONFIGURE' ) 
GO  
 
 
 
--------------------------------------------------------------------------- 
 
--8343毫秒 
/* 
表 '#0CBAE877'。扫描计数 0,逻辑读取 10 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
 
(10 行受影响) 
表 'numbers'。扫描计数 0,逻辑读取 1003344 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
表 '#0CBAE877'。扫描计数 6,逻辑读取 111111 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
 
(1000000 行受影响) 
*/ 
 
--3.3表卡迪尔 
 
DECLARE @t TABLE ( number INT ) 
INSERT  INTO @t 
        SELECT  0 
        UNION ALL 
        SELECT  1 
        UNION ALL 
        SELECT  2 
        UNION ALL 
        SELECT  3 
        UNION ALL 
        SELECT  4 
        UNION ALL 
        SELECT  5 
        UNION ALL 
        SELECT  6 
        UNION ALL 
        SELECT  7 
        UNION ALL 
        SELECT  8 
        UNION ALL 
        SELECT  9 
        UNION ALL 
        SELECT  10 
        UNION ALL 
        SELECT  11 
        UNION ALL 
        SELECT  12 
        UNION ALL 
        SELECT  13 
        UNION ALL 
        SELECT  14 
        UNION ALL 
        SELECT  15 
        UNION ALL 
        SELECT  16 
        UNION ALL 
        SELECT  17 
        UNION ALL 
        SELECT  18 
        UNION ALL 
        SELECT  19 
        UNION ALL 
        SELECT  20 
        UNION ALL 
        SELECT  21 
        UNION ALL 
        SELECT  22 
        UNION ALL 
        SELECT  23 
        UNION ALL 
        SELECT  24 
        UNION ALL 
        SELECT  25 
        UNION ALL 
        SELECT  26 
        UNION ALL 
        SELECT  27 
        UNION ALL 
        SELECT  28 
        UNION ALL 
        SELECT  29 
        UNION ALL 
        SELECT  30 
        UNION ALL 
        SELECT  31 
        UNION ALL 
        SELECT  32 
        UNION ALL 
        SELECT  33 
        UNION ALL 
        SELECT  34 
        UNION ALL 
        SELECT  35 
        UNION ALL 
        SELECT  36 
        UNION ALL 
        SELECT  37 
        UNION ALL 
        SELECT  38 
        UNION ALL 
        SELECT  39 
        UNION ALL 
        SELECT  40 
        UNION ALL 
        SELECT  41 
        UNION ALL 
        SELECT  42 
        UNION ALL 
        SELECT  43 
        UNION ALL 
        SELECT  44 
        UNION ALL 
        SELECT  45 
        UNION ALL 
        SELECT  46 
        UNION ALL 
        SELECT  47 
        UNION ALL 
        SELECT  48 
        UNION ALL 
        SELECT  49 
        UNION ALL 
        SELECT  50 
        UNION ALL 
        SELECT  51 
        UNION ALL 
        SELECT  52 
        UNION ALL 
        SELECT  53 
        UNION ALL 
        SELECT  54 
        UNION ALL 
        SELECT  55 
        UNION ALL 
        SELECT  56 
        UNION ALL 
        SELECT  57 
        UNION ALL 
        SELECT  58 
        UNION ALL 
        SELECT  59 
        UNION ALL 
        SELECT  60 
        UNION ALL 
        SELECT  61 
        UNION ALL 
        SELECT  62 
        UNION ALL 
        SELECT  63 
        UNION ALL 
        SELECT  64 
        UNION ALL 
        SELECT  65 
        UNION ALL 
        SELECT  66 
        UNION ALL 
        SELECT  67 
        UNION ALL 
        SELECT  68 
        UNION ALL 
        SELECT  69 
        UNION ALL 
        SELECT  70 
        UNION ALL 
        SELECT  71 
        UNION ALL 
        SELECT  72 
        UNION ALL 
        SELECT  73 
        UNION ALL 
        SELECT  74 
        UNION ALL 
        SELECT  75 
        UNION ALL 
        SELECT  76 
        UNION ALL 
        SELECT  77 
        UNION ALL 
        SELECT  78 
        UNION ALL 
        SELECT  79 
        UNION ALL 
        SELECT  80 
        UNION ALL 
        SELECT  81 
        UNION ALL 
        SELECT  82 
        UNION ALL 
        SELECT  83 
        UNION ALL 
        SELECT  84 
        UNION ALL 
        SELECT  85 
        UNION ALL 
        SELECT  86 
        UNION ALL 
        SELECT  87 
        UNION ALL 
        SELECT  88 
        UNION ALL 
        SELECT  89 
        UNION ALL 
        SELECT  90 
        UNION ALL 
        SELECT  91 
        UNION ALL 
        SELECT  92 
        UNION ALL 
        SELECT  93 
        UNION ALL 
        SELECT  94 
        UNION ALL 
        SELECT  95 
        UNION ALL 
        SELECT  96 
        UNION ALL 
        SELECT  97 
        UNION ALL 
        SELECT  98 
        UNION ALL 
        SELECT  99 
 
 
  
INSERT INTO numbers   
SELECT  t1.number *10 + t2.number  * 1000 + t3.number *10000 
        * 1000 
FROM    @t AS t1 , 
        @t AS t2 , 
        @t AS t3 
 
--测试脚本 
 
----------------------------------------------------------------------- 
DECLARE @beginTime DATETIME 
 
SET @beginTime=Getdate() 
--------------------------------- 
SET STATISTICS IO ON 
DECLARE @t TABLE ( number INT ) 
INSERT  INTO @t 
        SELECT  0 
        UNION ALL 
        SELECT  1 
        UNION ALL 
        SELECT  2 
        UNION ALL 
        SELECT  3 
        UNION ALL 
        SELECT  4 
        UNION ALL 
        SELECT  5 
        UNION ALL 
        SELECT  6 
        UNION ALL 
        SELECT  7 
        UNION ALL 
        SELECT  8 
        UNION ALL 
        SELECT  9 
        UNION ALL 
        SELECT  10 
        UNION ALL 
        SELECT  11 
        UNION ALL 
        SELECT  12 
        UNION ALL 
        SELECT  13 
        UNION ALL 
        SELECT  14 
        UNION ALL 
        SELECT  15 
        UNION ALL 
        SELECT  16 
        UNION ALL 
        SELECT  17 
        UNION ALL 
        SELECT  18 
        UNION ALL 
        SELECT  19 
        UNION ALL 
        SELECT  20 
        UNION ALL 
        SELECT  21 
        UNION ALL 
        SELECT  22 
        UNION ALL 
        SELECT  23 
        UNION ALL 
        SELECT  24 
        UNION ALL 
        SELECT  25 
        UNION ALL 
        SELECT  26 
        UNION ALL 
        SELECT  27 
        UNION ALL 
        SELECT  28 
        UNION ALL 
        SELECT  29 
        UNION ALL 
        SELECT  30 
        UNION ALL 
        SELECT  31 
        UNION ALL 
        SELECT  32 
        UNION ALL 
        SELECT  33 
        UNION ALL 
        SELECT  34 
        UNION ALL 
        SELECT  35 
        UNION ALL 
        SELECT  36 
        UNION ALL 
        SELECT  37 
        UNION ALL 
        SELECT  38 
        UNION ALL 
        SELECT  39 
        UNION ALL 
        SELECT  40 
        UNION ALL 
        SELECT  41 
        UNION ALL 
        SELECT  42 
        UNION ALL 
        SELECT  43 
        UNION ALL 
        SELECT  44 
        UNION ALL 
        SELECT  45 
        UNION ALL 
        SELECT  46 
        UNION ALL 
        SELECT  47 
        UNION ALL 
        SELECT  48 
        UNION ALL 
        SELECT  49 
        UNION ALL 
        SELECT  50 
        UNION ALL 
        SELECT  51 
        UNION ALL 
        SELECT  52 
        UNION ALL 
        SELECT  53 
        UNION ALL 
        SELECT  54 
        UNION ALL 
        SELECT  55 
        UNION ALL 
        SELECT  56 
        UNION ALL 
        SELECT  57 
        UNION ALL 
        SELECT  58 
        UNION ALL 
        SELECT  59 
        UNION ALL 
        SELECT  60 
        UNION ALL 
        SELECT  61 
        UNION ALL 
        SELECT  62 
        UNION ALL 
        SELECT  63 
        UNION ALL 
        SELECT  64 
        UNION ALL 
        SELECT  65 
        UNION ALL 
        SELECT  66 
        UNION ALL 
        SELECT  67 
        UNION ALL 
        SELECT  68 
        UNION ALL 
        SELECT  69 
        UNION ALL 
        SELECT  70 
        UNION ALL 
        SELECT  71 
        UNION ALL 
        SELECT  72 
        UNION ALL 
        SELECT  73 
        UNION ALL 
        SELECT  74 
        UNION ALL 
        SELECT  75 
        UNION ALL 
        SELECT  76 
        UNION ALL 
        SELECT  77 
        UNION ALL 
        SELECT  78 
        UNION ALL 
        SELECT  79 
        UNION ALL 
        SELECT  80 
        UNION ALL 
        SELECT  81 
        UNION ALL 
        SELECT  82 
        UNION ALL 
        SELECT  83 
        UNION ALL 
        SELECT  84 
        UNION ALL 
        SELECT  85 
        UNION ALL 
        SELECT  86 
        UNION ALL 
        SELECT  87 
        UNION ALL 
        SELECT  88 
        UNION ALL 
        SELECT  89 
        UNION ALL 
        SELECT  90 
        UNION ALL 
        SELECT  91 
        UNION ALL 
        SELECT  92 
        UNION ALL 
        SELECT  93 
        UNION ALL 
        SELECT  94 
        UNION ALL 
        SELECT  95 
        UNION ALL 
        SELECT  96 
        UNION ALL 
        SELECT  97 
        UNION ALL 
        SELECT  98 
        UNION ALL 
        SELECT  99 
 
 
  
INSERT INTO numbers   
SELECT  t1.number *10 + t2.number  * 1000 + t3.number *10000 
        * 1000 
FROM    @t AS t1 , 
        @t AS t2 , 
        @t AS t3 
 
 
-------------------------------- 
SELECT Datediff(ms, @beginTime, Getdate()) AS [Time(ms)] 
 
SET STATISTICS IO off 
TRUNCATE TABLE numbers  
 
 
---强行释放内存,清除缓冲区数据 
 
DBCC FREEPROCCACHE  
DBCC FREESESSIONCACHE  
DBCC FREESYSTEMCACHE('All')  
DBCC DROPCLEANBUFFERS  
 
exec sp_configure 'max server memory', 128  
EXEC ('RECONFIGURE' ) 
 
WAITFOR DELAY '00:00:03
 
EXEC  sp_configure 'max server memory', 2147483647  
EXEC ('RECONFIGURE' ) 
GO  
 
 
--8123毫秒,稍微比2方案快,以为第三个表的逻辑扫描减少 
/* 
表 '#1367E606'。扫描计数 0,逻辑读取 100 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
 
(100 行受影响) 
表 'numbers'。扫描计数 0,逻辑读取 1003344 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
表 '#1367E606'。扫描计数 3,逻辑读取 10101 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
 
(1000000 行受影响) 
*/ 
 
 
 
--4.Identity 
 
declare @beginTime datetime 
  
set @beginTime=getdate() 
  
SELECT TOP 1000000  IDENTITY(INT,0,1AS idx 
  
   INTO dbo.Numbers2 
  
   FROM master.sys.all_columns c1 
  
  CROSS JOIN master.sys.all_columns c2 
  
select datediff(ms,@beginTime,getdate()) as [Time(ms)] 
 
 
 
----------------------------------------------------- 
SET STATISTICS IO off 
 
 
 
---强行释放内存,清除缓冲区数据 
 
DBCC FREEPROCCACHE  
DBCC FREESESSIONCACHE  
DBCC FREESYSTEMCACHE('All')  
DBCC DROPCLEANBUFFERS  
 
exec sp_configure 'max server memory', 128  
EXEC ('RECONFIGURE' ) 
 
WAITFOR DELAY '00:00:03
 
EXEC  sp_configure 'max server memory', 2147483647  
EXEC ('RECONFIGURE' ) 
GO  
 
 
 
--2876毫秒,无IO逻辑读取 
 
 
--5.row_number 
 
declare @beginTime datetime 
  
set @beginTime=getdate() 
  
 SELECT TOP 1000000 
  
       ROW_NUMBER() over (order by c1.object_id) AS N 
  
   INTO dbo.Numbers3 
  
   FROM master.sys.all_columns c1 
  
  CROSS JOIN master.sys.all_columns c2 
  
select datediff(ms,@beginTime,getdate()) as [Time(ms)] 
----------------------------------------------------- 
SET STATISTICS IO off 
 
 
 
---强行释放内存,清除缓冲区数据 
 
DBCC FREEPROCCACHE  
DBCC FREESESSIONCACHE  
DBCC FREESYSTEMCACHE('All')  
DBCC DROPCLEANBUFFERS  
 
exec sp_configure 'max server memory', 128  
EXEC ('RECONFIGURE' ) 
 
WAITFOR DELAY '00:00:03
 
EXEC  sp_configure 'max server memory', 2147483647  
EXEC ('RECONFIGURE' ) 
GO  
 
 
--1270毫秒,无IO逻辑读取