SQL中表变量的使用,代替IN的操作(效果差不多,有时IN可能会比表变量的好一点点:数据量10000000)
2013-03-06 14:30
435 查看
创建模拟数据
set statistics profile on--查看执行过程
表变量--执行时间2-3秒
分步查询--执行时间2-3秒
CREATE TABLE t_userinfo( userid int identity(1,1) primary key nonclustered, nick varchar(50) not null default '', classid int not null default 0, writetime datetime not null default getdate()) go -- 建索引 create clustered index ix_userinfo_classid on t_userinfo(classid) go -- 插入数据 declare @i int declare @k int declare @nick varchar(10) set @i = 1 while @i<10000000 begin set @k = @i % 10 set @nick = convert(varchar,@i) insert into t_userinfo(nick,classid,writetime) values(@nick,@k,getdate()) set @i = @i + 1 end
set statistics profile on--查看执行过程
表变量--执行时间2-3秒
declare @tempTb table(id int) insert @tempTb select 1 union all select 2 union all select 3 union all select 4 union all select 5; --select * from @tempTb select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo inner join @tempTb on classid=id where writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid ascunion all--执行时间5-6秒
select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid =1 and writetime>'2013-03-05 17:49:33.247' order by userid asc union all select top 1000000 userid from t_userinfo where classid =2 and writetime>'2013-03-05 17:49:33.247' order by userid asc union all select top 1000000 userid from t_userinfo where classid =3 and writetime>'2013-03-05 17:49:33.247' order by userid asc union all select top 1000000 userid from t_userinfo where classid =4 and writetime>'2013-03-05 17:49:33.247' order by userid asc union all select top 1000000 userid from t_userinfo where classid =5 and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc分步查询--执行时间4-5秒
select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid =1 and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid =2 and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid =3 and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid =4 and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid =5 and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc
分步查询--执行时间2-3秒
set statistics profile on select a.userid,b.nick,b.classid,b.writetime from ( select top 20 a.userid from ( select top 1000000 userid from t_userinfo where classid in(1,2,3,4,5) and writetime>'2013-03-05 17:49:33.247' order by userid asc ) a order by a.userid desc )a inner join t_userinfo b on a.userid = b.userid order by a.userid asc
相关文章推荐
- XDocReport 的简单使用 操作word 替换变量,动态图片,指定操作指令(程序)扩展(转自:http://www.cnblogs.com/fish-in-sky/p/4973237.html)
- SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
- 动态sql语句基本语法(字段名,表名,数据库名之类作为变量时,必须用动态SQL如ALTER TABLE中使用程序传递的参数)
- Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)
- Silverlight ——使用LINQ to SQL进行数据CRUD操作(上)
- [导入]Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
- 在ASP.NET 2.0中操作数据之四十六:使用SqlDataSource控件检索数据
- SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
- 在ASP.NET中使用SQL的IN操作
- Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
- 使用T-SQL语句操作数据表-查询数据
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
- 如何在对in操作使用变量绑定
- 使用SQL语句对表进行插入、修改和删除数据操作
- Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)
- SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
- 【Hadoop】HBase上安装使用Phoenix来用sql语句更新操作数据,安装的过程各种坑和经验
- 使用SQL游标对数据进行遍历循环操作
- slick使用普通的sql操作数据
- 使用Phoenix通过sql语句更新操作hbase数据