翻页查询中遇到的奇怪问题

小灰狼 2013-06-28 02:57:54

select
*
from
(
select
row_number() over (order by Id asc) as rownumber, *
from mytablename
where
DeviceId = 27 and
CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000'
) t
where
t.rownumber >= 31 and t.rownumber <= 40;


表中有将近300万条记录,其中 id 是主键,在DeviceId和CreatedDateTime上有索引

当后面的 t.rownumber <= 40 条件不用时,查询非常快,显示是0秒
当 t.rownumber <= 40 启用时,每次查询都需要5秒
...全文
189 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2013-07-03
  • 打赏
  • 举报
回复
自己 up 一下,期待答案
小灰狼 2013-07-02
  • 打赏
  • 举报
回复
引用 10 楼 lzw_0736 的回复:
神速翻页查询确实是个难题啊
300万条记录,不算多吧,sql server 可是企业级数据库啊 并且,奇怪的地方是,子查询里得到全部数据只需要很短的时间,但是加上 rownumber < XXX 就怀具了
lzw_0736 2013-06-29
  • 打赏
  • 举报
回复
上面有誤,糾正如下: declare @i1 int,@i2 int select @i1=max(id) from ( select top 31 id from mytablename where DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' order by id ) a select @i2=max(id) from ( select top 10 id from mytablename where id>=@i1 and DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' order by id ) a select * from mytablename where id between @i1 and @i2 order by re
lzw_0736 2013-06-29
  • 打赏
  • 举报
回复
再测试以下回复效率如何: declare @i1 int,@i2 int select @i1=min(id) from ( select top 31 id from mytablename where DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' order by id ) a select @i2=max(id) from ( select top 10 id from mytablename where id>=31 and DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' order by id ) a select * from mytablename where id between @i1 and @i2 order by id
小灰狼 2013-06-29
  • 打赏
  • 举报
回复
3 楼的写法我试过了,有时快,只有2、3秒,有时慢,需要10多秒,并且多运行几次之后,就非常快了,是0秒,可能全部读到缓存里了 只是我奇怪的是,为什么对一个子查询取小范围的结果集,比全部得到这个子查询的结果集花的时间多很多
lzw_0736 2013-06-29
  • 打赏
  • 举报
回复
神速翻页查询确实是个难题啊
小灰狼 2013-06-29
  • 打赏
  • 举报
回复
引用 8 楼 lzw_0736 的回复:
上面有誤,糾正如下: declare @i1 int,@i2 int select @i1=max(id) from ( select top 31 id from mytablename where DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' order by id ) a select @i2=max(id) from ( select top 10 id from mytablename where id>=@i1 and DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' order by id ) a select * from mytablename where id between @i1 and @i2 order by re
大锅,你这样还慢些呢
dc_c 2013-06-28
  • 打赏
  • 举报
回复
20W的源数据测试
t.rownumber >= 31 and 
	t.rownumber <= 40;
0S
t.rownumber >= 31;
6S 测试3楼的语句 0S 建议用执行计划查查原因,是否缺少索引
hackervip1988 2013-06-28
  • 打赏
  • 举报
回复
引用 3 楼 lzw_0736 的回复:
試試以下: select top 10 * from ( select row_number() over (order by Id asc) as rownumber, * from mytablename where DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' ) t where t.rownumber >= 31 order by t.rownumber
lzw_0736 2013-06-28
  • 打赏
  • 举报
回复
試試以下: select top 10 * from ( select row_number() over (order by Id asc) as rownumber, * from mytablename where DeviceId = 27 and CreatedDateTime between '2013-06-27 10:00:00.000' and '2013-06-27 17:00:00.000' ) t where t.rownumber >= 31 order by t.rownumber
小灰狼 2013-06-28
  • 打赏
  • 举报
回复
引用 1 楼 Imaor 的回复:
你再加个 order by t.rownumber desc 会更慢
什么意思? 我写的是最简单的翻页啊
IEEE_China 2013-06-28
  • 打赏
  • 举报
回复
你再加个 order by t.rownumber desc 会更慢

34,590

社区成员

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

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