查询 31到40条记录 的各种玩法(分页可以支持海量数据5百万,时间大约在1--5秒)

来自:http://www.cnblogs.com/wenyang-rio/archive/2012/10/25/2738499.html 

平常工作,尤其是面试中经常遇到这样一个问题,查询表A中31到40条的记录,ID可能是不连续的。

    1. 如果ID连续

      select * from A where ID between 31 and 40

       

    2. 如果ID不连续,提供三种写法

       

      --两次对表A查询效率较低
      select top 10 * from A where ID not in (select top 30 ID from A)

       

      --外层查询没有对表A查询,效率大有提高
      select top 10 * from (select top 40 * from A order by ID) as t order by t.ID desc

       

      --ROW_NUMBER()函数效率更高,sqlserver2005以及以上版本中才可以使用
      select * from (select ROW_NUMBER() over(order by ID) as 'sequence',A.*  from A ) as t where t.sequence between 31 and 40

       

 不知道还有没有其他写法,我在此抛出一块砖 ……

 


 

不一会儿,就接到几块玉(期待更多的玉):

 

@金色海洋(jyk)阳光男孩

--如果是海量数据做查询的话,这个是更高效的,这个不错
select
top 10 * from A where id in (select top 10 id from (select top 40 id from A order by ID desc) as t order by t.ID ) order by A.ID desc

      

select top 1000 IWT_Page.* from IWT_Page  join
(select top 1000 Item_ID from (select top 7000000 Item_ID from IWT_Page order by Item_ID desc) as t order by t.Item_ID ) as z
on
z.item_id=IWT_Page.item_id

order by IWT_Page.Item_ID desc

海量7百万数据下, IN 与 JOIN 的速度到在1--5秒之间,但是如果你好奇的用right join 可能就会时间更长。

注意:order by 后面的字段一定要建立聚集索引或非聚集索引(是对这个字段建立单独的索引,不要与其他的字段混合在一起建立索引。)。才会提高速度的。

       @害怕飞的鸟

--这哥们给出了sql2012的新写法,我机器上没装这么前卫的工具,在我老大的机器上测试可行,性能效率暂不明确
SELECT * FROM A Order by ID OFFSET 30 ROWS FETCH NEXT 10 ROWS ONLY

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值