求sql”高效“分页及其原理

虎虎0369 2011-01-29 01:05:00
如题:以前我的分页都是用的select top 10 * from 表 where id not in (select top 10 id from 表)这种方式来分的页,今天我一个同事突然看见提醒我如果有几千几万条数据 那执行时会先把子查询中所有的id查出来 这样性能不是很好 我列了几个分页方法:
1 采用top 方法分页
2 采用row_number方式
3 这是我同事的方式(c#代码): SqlDataAdapter adapter = new SqlDataAdapter(command, conn);
adapter.Fill(ds, index, pageSize, "ds"); (个人觉得这个方法应该和2方法最后执行原理一样)


请大家说哈sql查询语句的执行顺序 :
比如select * from (select row_number() over(order by getdate()) as i,* from 表 where i between 10 and 20)
where条件是在所有的数据筛选完了再进行选择的吗 那样效率肯定低了
...全文
246 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
haitao 2011-01-30
刚刚比较过:
http://blog.csdn.net/sz_haitao/archive/2011/01/10/6127571.aspx

看执行计划,多次top倒腾法、row_number()法 是一样的开销,
但是实际情况,跳过的记录数越多,top倒腾的就慢得越厉害
回复
Rotel-刘志东 2011-01-29
看执行效率的sql server2005 row_number() over(order by column) as 'alias'
回复
王向飞 2011-01-29
一种是数据库级别的分页,一种是程序级的分页。2005版本数据库分页推荐采用row_number
回复
[Quote=引用 6 楼 min565220 的回复:]
大家看哈我这个分页怎么样:
select * from
(
select row_number() over(order by avg(price)) as i,roleId,min(id) as Id,avg(price) as AvgPrice
from Tb_ComputerProductInfo
where typeid=3
group by roleId ) as t……
[/Quote]

举一反三,很好!
回复
虎虎0369 2011-01-29
大家看哈我这个分页怎么样:
select * from
(
select row_number() over(order by avg(price)) as i,roleId,min(id) as Id,avg(price) as AvgPrice
from Tb_ComputerProductInfo
where typeid=3
group by roleId ) as t where t.i between 10 and 20
回复
对于LZ用TOP和NOT IN的方法还有一个很大的漏洞!
多表的情况,比如说是两个表:A和B A的id是自增列,主键,唯一标识,如果B中有多条数据行和A中的某个id对应,即 A表id为一的在B表中有许多数据,两表联合查询分页的话,可能会出现丢失数据的情况。
回复
feixianxxx 2011-01-29
原理简单来说 就是一次从服务器取的数据量大大减少,不分页一次从服务器拿出全部数据到客户端,相比之下 效率就高了。。
回复
个人觉得高效分页不要用TOP 、 NOT IN 之类的,数据量大了天慢!
有唯一标识了用 between .. and .. 没的话构造个。
回复
叶子 2011-01-29
sql server 2000 单主键高效分页存储过程
http://www.cnblogs.com/nzperfect/archive/2009/06/14/1503237.html

sql server 高效分页
http://zhouwenjun.javaeye.com/blog/510091
回复
rucypli 2011-01-29
看效率执行的最直接办法就是看执行时间
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2011-01-29 01:05
社区公告
暂无公告