锁定老帖子 主题:关于分页查询的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-25
cats_tiger 写道 引用 这并不奇怪。
只能说楼主没有仔细想过数据库查询的基本方法。 一个简单的两个表的inner join,如果要分页,就需要首先得到整个结果集的数量。而仅仅通过top, limit限定范围,则只需要达到限制的数量就可以了。 top 和 limit实现,要比分页简单多了。 所以数据库设计者,是将分页交给用户来作处理而已。 不实现分页不是说分页没有用。 还是很奇怪呀,分页的确比limit复杂,正因为如此,数据库设计者才不应该把这个工作交给用户。SQLServer压根就没有为分页查询提供可能的技术,Oracle好歹还有一个ROW_NUM,SQLServer的top...唉!这种情况显然与MS的一贯做法不同,MS向来重视客户体验。 实际上,对于数据库设计者来说,提供一个分页功能实在是太简单了。 传言SQL Server 2005提供了分页SQL,不知道是不是真的。 SQL Server可以使用sp_系统存储过程来移动游标实现数据库端分页。 BTW:Microsoft从来都是针对最终消费者的体验好,针对程序员,就难说了。 |
|
返回顶楼 | |
发表时间:2006-10-25
cats_tiger 写道 引用 写道 分页很简单啊,没有多运行什么所谓的查询条件,只是当查询出等于pageSize的数量时暂停查询而已啊,已经查出来的数据会放在数据库缓存中,等再次查询时,也可以提高数据库缓存命中率。不能理解性能如何大大下降啊。 我所说的“额外的查询”是指那个count查询,如果不加查询条件,count是很快的,如果加查询条件并且不走索引,count查询就很慢了。多数分页查询,都要执行一个count查询吧,它不会影响性能吗? 这个count可以在条件不变情况下缓存,比如bbs就可以把某个板块的帖子数目存板块表里面 sql2005有朋友使用了,不过没听他们说过有分页函数(也有可能他们还没摸那么深). 不过不能不说,mssql在分页上确实有点混蛋:( |
|
返回顶楼 | |
发表时间:2006-10-25
更正:
刚google了下,mssql2005确实有ROW_NUMBER来解决分页问题的. demo语句: select threadid from (select threadid, ROW_NUMBER() OVER (order by stickydate) as Pos from cs_threads) as T where T.Pos > 100000 and T.Pos < 100030 |
|
返回顶楼 | |
发表时间:2006-10-25
叶子 写道 这个count可以在条件不变情况下缓存,比如bbs就可以把某个板块的帖子数目存板块表里面 sql2005有朋友使用了,不过没听他们说过有分页函数(也有可能他们还没摸那么深). 不过不能不说,mssql在分页上确实有点混蛋:( count缓存也是不太保险的,实现起来容易,但要保证数据的完全一致,有点困难。 这个倒是冤枉了mssql。虽然它没有像oracle/mysql提供内置的分页方法,但是用游标定位的方式,还是可以快速的实现分页的。在asp中,ADO提供了resultset的PageSize和AbsolutePage函数,也是采用游标定位。假如你要每页显示30条,定位到第2页,这样写就可以实现:rs.PageSize=30 rs.AbsolutePage=2。 传说sqlserver2005提供了内置分页功能,这是真的。2005中也像oracle一样有rownum,它的分页方式和oracle采用rownum分页语句很相似。 |
|
返回顶楼 | |
发表时间:2006-10-25
together 写道 叶子 写道 这个count可以在条件不变情况下缓存,比如bbs就可以把某个板块的帖子数目存板块表里面 sql2005有朋友使用了,不过没听他们说过有分页函数(也有可能他们还没摸那么深). 不过不能不说,mssql在分页上确实有点混蛋:( count缓存也是不太保险的,实现起来容易,但要保证数据的完全一致,有点困难。 这个倒是冤枉了mssql。虽然它没有像oracle/mysql提供内置的分页方法,但是用游标定位的方式,还是可以快速的实现分页的。在asp中,ADO提供了resultset的PageSize和AbsolutePage函数,也是采用游标定位。假如你要每页显示30条,定位到第2页,这样写就可以实现:rs.PageSize=30 rs.AbsolutePage=2。 传说sqlserver2005提供了内置分页功能,这是真的。2005中也像oracle一样有rownum,它的分页方式和oracle采用rownum分页语句很相似。 是不太保险,需要自己考虑有数据更改情况下更新. ^_^,偶就是写asp出家的,对这个很熟悉.游标的性能,也就那么回事吧. AbsolutePosition,AbsolutePage对ac是速度最快的,不过对mssql是噩梦. 另扯一句,asp里缓存count,对ac AbsolutePosition,对mssql用top ,之后再getrows,速度是最快滴. |
|
返回顶楼 | |
发表时间:2006-10-25
正是因为一个多余的count查询,所以才感觉分页查询不见得能够提高性能。当然,性能必须通过测试获得,凭感觉和经验是不行滴。我所接触的项目中,多数表可以预测一个大概的记录总数。如果记录总数<10k,我们就不采用分页查询了,而是利用extremeTable、DisplayTag或Tomahawk DataTable之类的taglib来分页。
PS.很多用户要求根据任意列排序(就像C/S方式),这个需求和分页结合起来也很麻烦。如果直接采用Taglib提供的功能就简单多了。 另外,用absolut定位光标的方式和用List.subList的方式不知道哪个更快。 引用 BTW:Microsoft从来都是针对最终消费者的体验好,针对程序员,就难说了。
MS还是很能体会程序员的辛苦的,看看.Net IDE,Java这么多IDE没有一个比得上。 |
|
返回顶楼 | |
发表时间:2006-10-25
cats_tiger 写道 正是因为一个多余的count查询,所以才感觉分页查询不见得能够提高性能。当然,性能必须通过测试获得,凭感觉和经验是不行滴。我所接触的项目中,多数表可以预测一个大概的记录总数。如果记录总数<10k,我们就不采用分页查询了,而是利用extremeTable、DisplayTag或Tomahawk DataTable之类的taglib来分页。
PS.很多用户要求根据任意列排序(就像C/S方式),这个需求和分页结合起来也很麻烦。如果直接采用Taglib提供的功能就简单多了。 另外,用absolut定位光标的方式和用List.subList的方式不知道哪个更快。 引用 BTW:Microsoft从来都是针对最终消费者的体验好,针对程序员,就难说了。
MS还是很能体会程序员的辛苦的,看看.Net IDE,Java这么多IDE没有一个比得上。 Visual Studio在代码功能上和Eclipse相比,差的太遥远了。 http://www.cnblogs.com/dflying/archive/2006/10/20/535210.html |
|
返回顶楼 | |
发表时间:2006-10-25
count查询对性能影响并不大,而且数据库本身可以缓存SQL的。
cats_tiger 写道 PS.很多用户要求根据任意列排序(就像C/S方式),这个需求和分页结合起来也很麻烦。如果直接采用Taglib提供的功能就简单多了。
这个实现起来也很easy,并没有什么难的。传几个参数而已。按任意列排序和模糊查询都非常容易实现的 另:分页,是一个不需要讨论的话题。就像为什么要OO,为什么要有软件工程一样。 |
|
返回顶楼 | |
发表时间:2006-10-25
together 写道 叶子 写道 这个count可以在条件不变情况下缓存,比如bbs就可以把某个板块的帖子数目存板块表里面 sql2005有朋友使用了,不过没听他们说过有分页函数(也有可能他们还没摸那么深). 不过不能不说,mssql在分页上确实有点混蛋:( count缓存也是不太保险的,实现起来容易,但要保证数据的完全一致,有点困难。 这个倒是冤枉了mssql。虽然它没有像oracle/mysql提供内置的分页方法,但是用游标定位的方式,还是可以快速的实现分页的。在asp中,ADO提供了resultset的PageSize和AbsolutePage函数,也是采用游标定位。假如你要每页显示30条,定位到第2页,这样写就可以实现:rs.PageSize=30 rs.AbsolutePage=2。 传说sqlserver2005提供了内置分页功能,这是真的。2005中也像oracle一样有rownum,它的分页方式和oracle采用rownum分页语句很相似。 你说的这个游标方式是数据库通用的,等同于JDBC里的Result.absolute()方法,一样,也是通用的。 但这个性能比数据库专有的方法要慢。 有的时候可以结合两种方法来实现,比如对于SQLSERVER2000, 在SQL中使用top来限制一部分记录,比如你要显示100--120记录,则select top 120,然后再使用Result.absolute()。 |
|
返回顶楼 | |
发表时间:2006-10-25
together 写道 count查询对性能影响并不大,而且数据库本身可以缓存SQL的。
cats_tiger 写道 PS.很多用户要求根据任意列排序(就像C/S方式),这个需求和分页结合起来也很麻烦。如果直接采用Taglib提供的功能就简单多了。
这个实现起来也很easy,并没有什么难的。传几个参数而已。按任意列排序和模糊查询都非常容易实现的 另:分页,是一个不需要讨论的话题。就像为什么要OO,为什么要有软件工程一样。 count影响不大? mssql里 无聊把23w ip库的记录insert到100w count下,时间很恐怖的,比top翻最后一页所花时间都多. |
|
返回顶楼 | |