您的位置:首页 > 数据库

【T-SQL】插入与删除大量数据

2013-07-20 11:20 295 查看
由于工作的原因,现在一直在使用SQL SERVER编程,用了几个月之后发现自己技术储备真是匮乏的很。分页查询、索引什么的都不会,最后,羞耻心与上进心使我决定好好学一下T-SQL这门数据库语言。

干学语法太枯燥了,我决定学习各种问题的SQL SERVER版解决方案。希望看过的各位不吝赐教,也希望能为T-SQL语法初学者提供一点帮助。

插  入  大  量  数  据

第一个案例就是插入删除大量数据,因为后面很多的例子都要以这个为基础

--创建表Users

create table Users
(
  userID bigint identity primary key
  , userName nvarchar(20)
  , sex varchar(6)
  , age int
)


插入大量数据的方式有两种:循环插入和批量插入

循环插入是初学者最先学会的大批量插入数据的方法,但是由于每次insert都要产生日志,所以该方法很慢

--循环插入
declare @count int
, @index int
set @count = 1000000
set @index = 1

while (@index < @count)
Begin
insert into Users(userName, sex, age)
select case when @index % 2 = 0 then N'张三' + CAST(@index as nvarchar(10))
when @index % 3 = 0 and @index not like '%6%' and @index not like '%9%' then N'王霞' + CAST(@index as nvarchar(10))
when @index % 5 = 0 then N'李四' + CAST(@index as varchar(10))
when @index % 7 = 0 then N'赵五' + CAST(@index as varchar(10))
else N'周六' + CAST(@index as nvarchar(10))
end
, case when @index % 3 = 0 and @index Not like '%6%' and @index not like '%9%' then 'Female' else 'Male' end
, ROUND(RAND() * 28, 0)

set @index = @index + 1;
End


批量插入我首选CTE批量插入,该方法很快

--CTE递归循环插入,是面向对象的,基于CLR,插入速度最快
Begin Transaction;
with numList(num) as
(
select 1
union all
select num + 1
from numList
where num < 1000000
)
insert into Users(userName, sex, age)
select case when num % 2 = 0 then N'张三' + CAST(num as nvarchar(10))
when num % 3 = 0 and num not like '%6%' and num not like '%9%' then N'王霞' + CAST(num as nvarchar(10))
when num % 5 = 0 then N'李四' + CAST(num as varchar(10))
when num % 7 = 0 then N'赵五' + CAST(num as varchar(10))
else N'周六' + CAST(num as nvarchar(10))
end
, case when num % 3 = 0 and num Not like '%6%' and num not like '%9%' then 'Female' else 'Male' end
, ROUND(CEILING(RAND(CHECKSUM(NEWID()))*28), 0)
from numList
option (maxrecursion 0)

if(@@ERROR <> 0) Rollback Transaction
else Commit Transaction


删  除  大  量  数  据

删除大量数据的方法有:delete循环删除、批量删除、truncate释放表资源

1 --循环删除,delete不仅会产生日志,而且还会锁记录
2 delete from Users
3 where userID > 50000
4
5 --批量删除
6 set rowcount 1000000;
7 while 1 = 1
8 Begin
9     Begin Transaction
10     delete from Users where userID > 50000
11     commit
12     if @@ROWCOUNT = 0
13         break;
14 End
15
16 --TRUNCATE删除,因为truncate属于DDL语句,所以只产生少量日志,删除速度快
17 truncate table Users


这三种方法的删除速度是truncate > 批量删除 > delete循环删除

truncate的删除速度简直是秒杀,但是他不能限制删除的范围,我将其理解为是在释放表的资源,所以不能加where限制,不知道对不对!

好了,关于插入、删除大量数据的方法我就学了这么多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: