如何加快插入的速度?
- SQL code
---------建立测试数据(MSSQL2000)if exists (select * from sysobjects where id = object_id(N'table1') and OBJECTPROPERTY(id, N'IsUserTable') = 1)begin drop table table1endGOCREATE TABLE [table1] ( [系统单号] [int] NOT NULL , [系统行号] [int] NULL , [系统款号] [int] NULL , [箱号] [varchar] (6000) COLLATE Chinese_PRC_CI_AS NULL , [颜色] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [尺码] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [数量] [numeric](20, 8) NULL ) ON [PRIMARY]GOInsert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','215',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','220',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','225',2.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','230',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','235',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','240',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','245',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','250',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','215',3.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','220',4.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','225',4.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','230',5.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','235',4.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','240',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','245',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','250',NULL)goselect * from table1go----由上面的表,写一个查询,目的:相同单号,相同箱号,相同颜色,相同款号分为一类,以尺码不同分配一个流水号----实现方法一:if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#tb') and type='U') drop table #tbselect Num=(select count(*) from table1 where 系统单号=a.系统单号 and 系统款号=a.系统款号 and 箱号=a.箱号 and 颜色=a.颜色 and 尺码<=a.尺码),*into #tb from table1 aselect * from #tb-------要得到的查询结果/*Num 系统单号 系统行号 系统款号 箱号 颜色 尺码 数量----------------------------------------------1 662 16030 15761 662#16030 白色 215 1.000000002 662 16030 15761 662#16030 白色 220 1.000000003 662 16030 15761 662#16030 白色 225 2.000000004 662 16030 15761 662#16030 白色 230 1.000000005 662 16030 15761 662#16030 白色 235 1.000000006 662 16030 15761 662#16030 白色 240 NULL7 662 16030 15761 662#16030 白色 245 NULL8 662 16030 15761 662#16030 白色 250 NULL1 662 16031 15761 662#16031 白色 215 3.000000002 662 16031 15761 662#16031 白色 220 4.000000003 662 16031 15761 662#16031 白色 225 4.000000004 662 16031 15761 662#16031 白色 230 5.000000005 662 16031 15761 662#16031 白色 235 4.000000006 662 16031 15761 662#16031 白色 240 NULL7 662 16031 15761 662#16031 白色 245 NULL8 662 16031 15761 662#16031 白色 250 NULL*/---发现当手插入3000多条记录时,就用了30秒,这样太慢了---我记得可以运用一个已有的流水号T_SN表然后跟table1进行连接,可以快很多的,一时忘了不知么写?----建立一个已有的流水号表,暂时用着5000条记录if exists (select * from sysobjects where id = object_id(N'T_SN') and OBJECTPROPERTY(id, N'IsUserTable') = 1)begin drop table T_SNendGOCREATE TABLE [T_SN] ( [number] [int] NULL ) ON [PRIMARY]GOdeclare @intNum intSET @intNum = 1WHILE @intNum <= 5000BEGIN INSERT INTO T_SN([Number]) VALUES(@intNum) SET @intNum = @intNum +1END
[解决办法]
一行一行循环是非常慢的
参考:
http://topic.csdn.net/t/20060718/08/4886776.html
[解决办法]
- SQL code
CREATE TABLE [table1] ( [系统单号] [int] NOT NULL , [系统行号] [int] NULL , [系统款号] [int] NULL , [箱号] [varchar] (6000) COLLATE Chinese_PRC_CI_AS NULL , [颜色] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [尺码] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [数量] [numeric](20, 8) NULL )Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','215',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','220',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','225',2.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','230',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','235',1.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','240',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','245',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16030,15761,'662#16030','白色','250',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','215',3.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','220',4.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','225',4.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','230',5.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','235',4.00000000)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','240',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','245',NULL)Insert table1 (系统单号,系统行号,系统款号,箱号,颜色,尺码,数量) Values ( 662,16031,15761,'662#16031','白色','250',NULL)select identity(int,1,1) rn,* into #table1 from table1select count(*) num,a.系统单号,max(a.系统行号) 系统行号,a.系统款号,a.箱号,a.颜色,max(a.尺码) 尺码,max(a.数量) 数量from #table1 aleft join #table1 bon b.系统单号=a.系统单号 and b.系统款号=a.系统款号 and b.箱号=a.箱号 and b.颜色=a.颜色 and b.尺码<=a.尺码group by a.rn,a.系统单号,a.系统款号,a.箱号,a.颜色num 系统单号 系统行号 系统款号 箱号 颜色 尺码 数量----------- ----------- ----------- ----------- ---------- ------ ------ ---------------------------------------1 662 16030 15761 662#16030 白色 215 1.000000002 662 16030 15761 662#16030 白色 220 1.000000003 662 16030 15761 662#16030 白色 225 2.000000004 662 16030 15761 662#16030 白色 230 1.000000005 662 16030 15761 662#16030 白色 235 1.000000006 662 16030 15761 662#16030 白色 240 NULL7 662 16030 15761 662#16030 白色 245 NULL8 662 16030 15761 662#16030 白色 250 NULL1 662 16031 15761 662#16031 白色 215 3.000000002 662 16031 15761 662#16031 白色 220 4.000000003 662 16031 15761 662#16031 白色 225 4.000000004 662 16031 15761 662#16031 白色 230 5.000000005 662 16031 15761 662#16031 白色 235 4.000000006 662 16031 15761 662#16031 白色 240 NULL7 662 16031 15761 662#16031 白色 245 NULL8 662 16031 15761 662#16031 白色 250 NULL
------解决方案--------------------
实在要分,还可以这样:
- SQL code
if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#tb') and type='U') drop table #tbselect num=identity(int,1,1),* into #tb from table1 order by 系统单号,系统行号,尺码if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#t2') and type='U') drop table #t2select a.num-b.num+1 num,a.系统单号,a.系统行号,a.系统款号,a.箱号,a.颜色,a.尺码,a.数量 into #t2 from #tb a inner join(select min(num)num,系统单号,系统行号,系统款号,箱号,颜色 from #tb group by 系统单号,系统行号,系统款号,箱号,颜色)b on a.系统单号=b.系统单号 and a.系统行号=b.系统行号 and a.系统款号=b.系统款号 and a.箱号=b.箱号 and a.颜色=b.颜色select * from #t2-------要得到的查询结果/*num 系统单号 系统行号 系统款号 箱号 颜色 尺码 数量----------- ----------- ----------- ----------- ---------------------------------------------------------------------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------1 662 16030 15761 662#16030 白色 215 1.000000002 662 16030 15761 662#16030 白色 220 1.000000003 662 16030 15761 662#16030 白色 225 2.000000004 662 16030 15761 662#16030 白色 230 1.000000005 662 16030 15761 662#16030 白色 235 1.000000006 662 16030 15761 662#16030 白色 240 NULL7 662 16030 15761 662#16030 白色 245 NULL8 662 16030 15761 662#16030 白色 250 NULL1 662 16031 15761 662#16031 白色 215 3.000000002 662 16031 15761 662#16031 白色 220 4.000000003 662 16031 15761 662#16031 白色 225 4.000000004 662 16031 15761 662#16031 白色 230 5.000000005 662 16031 15761 662#16031 白色 235 4.000000006 662 16031 15761 662#16031 白色 240 NULL7 662 16031 15761 662#16031 白色 245 NULL8 662 16031 15761 662#16031 白色 250 NULL(16 行受影响)*/