昨天去面试,对面非说1000W条数据分页查询要2秒以上,贴测试结果。

newnewffzz 2013-03-28 02:38:14
5年前第一次将分页语句用于某门户网站时依稀记得做过测试,插了几百万条数据在0.01秒以下,昨天去一家公司面试,谈到此事,对面技术说起千万级数据查询要2秒以上。
有疑惑今天就做了测试。

declare @i int set @i=1 while @i<=10000000 begin
insert into tt values('aa') set @i = @i + 1 end
首先插了1000万条数据,破机器插了30分钟左右。


declare @d datetime
SET @d=getdate()
select top 10 * from tt where Id not in(select top 1000000 Id from tt)
SELECT [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

开始测试,分别测试了3种分页,时间如下:


select top 10 * from tt where Id not in(select top 1000000 Id from tt) 530-590毫秒
select top 10 * from tt where Id> (select max(Id)from (select top 1000000 Id from tt order by Id)tt) 7-9秒
SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.ID desc)AS Row, T.* from tt T ) TT WHERE TT.Row between 1000000 and 1000050 16-27秒


顺便问下还有效率更高的没。。
...全文
811 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
最爱午夜 2013-05-27
  • 打赏
  • 举报
回复
关键是排序字段,
seusoftware 2013-03-29
  • 打赏
  • 举报
回复
第一个top 没有排序啊
sh1618 2013-03-29
  • 打赏
  • 举报
回复
查了一sql2012的offset 不过没有测试过 http://www.cnblogs.com/CareySon/archive/2012/03/09/2387825.html
sh1618 2013-03-29
  • 打赏
  • 举报
回复
SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.ID desc)AS Row from tt T ) TT WHERE TT.Row between 1000000 and 1000010 我感觉这个比较好些 不知道有没有更好的
sh1618 2013-03-29
  • 打赏
  • 举报
回复
引用 7 楼 maco_wang 的回复:
从100个苹果中随便选5个苹果,和从100个苹果中选5个最大的苹果,时间应该是不一样的。
+1 链接查询 排序 条件筛选上 (还有字段多少 比如 content 占太多字符)
max20120614 2013-03-28
  • 打赏
  • 举报
回复
亲 求解分页这个概念到底是什么?
叶子 2013-03-28
  • 打赏
  • 举报
回复
从100个苹果中随便选5个苹果,和从100个苹果中选5个最大的苹果,时间应该是不一样的。
洳夢绚染 2013-03-28
  • 打赏
  • 举报
回复
也就是说效率主要是浪费在排序上了?这科学吗?
newnewffzz 2013-03-28
  • 打赏
  • 举报
回复
这样就不科学了,因为实际应用中这种表99%会有个时间字段并且会根据时间去排序和查询。
newnewffzz 2013-03-28
  • 打赏
  • 举报
回复
引用 2 楼 SQL_Beginner 的回复:
"select top 10 * from tt where Id not in(select top 1000000 Id from tt) 530-590毫秒 select top 10 * from tt where Id> (select max(Id)from (select top 1000000 Id from tt order by Id)tt) ……
查第100W条的后面10条,这个提醒了我测试时把100W分别改成500W和900W。 后面3个时间分别为100W 、500W、900W,N000000为1000000、5000000、9000000. SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.ID desc)AS Row from tt T ) TT WHERE TT.Row between N000000 and N000010 6秒 15秒 16秒 select top 10 * from tt where Id> (select max(Id)from (select top N000000 Id from tt order by Id)tt) 6秒 16秒 19秒 select top 10 * from tt where Id not in(select top N000000 Id from tt) 550毫秒 3500毫秒 9600毫秒 select id from ( select top 10 id from ( select top N000000 id from tt order by id asc) t order by id desc) t order by id asc 6秒 15秒 20秒 但是550毫秒的方法加入ORDER BY 后,时间也和其他方法统一了(5秒左右),其他方法能去掉ORDER BY 的,一旦去掉也会变成1秒以下。
newnewffzz 2013-03-28
  • 打赏
  • 举报
回复
--2000的TOP分页方式 select id from ( select top 10 id from ( select top 1000000 id from tt order by id asc) t order by id desc) t order by id asc 6秒 SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.ID desc)AS Row from tt T ) TT WHERE TT.Row between 1000000 and 1000010 原来这个算2005的分页方式,也是7秒左右,上面多写了点东西。。 2012没装。。暂时测不了,不过找到有人测试过了http://www.cnblogs.com/CareySon/archive/2012/03/09/2387825.html,测试结果是100W条数据100-350毫秒,他的结论是和2005的方式效率差不多。
  • 打赏
  • 举报
回复
"select top 10 * from tt where Id not in(select top 1000000 Id from tt) 530-590毫秒 select top 10 * from tt where Id> (select max(Id)from (select top 1000000 Id from tt order by Id)tt) 7-9秒 " 你上面2个查询测的是哪条到哪条呀?
dawugui 2013-03-28
  • 打赏
  • 举报
回复
SQL SERVER2012新分页方式 http://topic.csdn.net/u/20120319/19/fb516bd9-f600-430a-8d0f-ed6a911f4ca2.html?33482

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧