gc00001
gc00001
2013-05-08 10:17

关于hibernate分页的效率问题

已采纳

今天在做hibernate分页的时候有个人在看到我后台报的sql语句时跟我说这个是假分页,sql语句是这样的select * from (select row_.*,rownum rownum_ from (select t.* from user_view t) row_) where rownum_ <= 20 and rownum_ > 10,他跟我说首先执行了里面的语句查询出了所有的东西然后在执行了外面的语句,然后他说真分页应该是这样的select * from (select rownum rn,a.name from user_view a where rownum <=20) t where t.rn >= 10,然后他把这两条语句放到plsql的sql执行窗口里面执行了解释计划,跟我说第一条语句的基数是表里所有的记录数,第二条语句的基数是20,这说明了计算机在执行第一条语句的时候是先查出了所有的东西。但是我执行了这两条语句其实耗时是差不多的,但是他说在本机的查询看不出效率的差别,要连外部的数据库查询才能看出效率差别,我想全世界那么多人在用hibernate真分页,不会都被忽悠了吧,我该怎么反驳这个事情。我上传了截图

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • anduo1989 classtag 8年前

    1.肯定一下,那个告诉你是假分页的人是正确的,通过你打印的SQL应该是假分页。因为在内层已经查询了全部select t.* from user_view t 这个地方没有分页。正确的写法是那个人告诉你的写法。

    2.效率问题是因为你的基数不够大,可以尝试下数据库单表100W数据量,然后你在对比下两个SQL的效率,答案是肯定的。第二个效率肯定高。

    3.hibernate对各种数据库方言分页的写法可以参看:http://my-corner.iteye.com/blog/721903

    点赞 评论 复制链接分享
  • iteye_15034 iteye_15034 8年前

    分页不是用limit吗?

    点赞 评论 复制链接分享
  • nimasike 温故而知新666 8年前

    看不出差别是数据量还不够多 数据量少的话肯定看不出差别 楼上说的对 你把数据库的数据增加到过百万行的数据 不同测试工具 你自己都能感觉出来。

    点赞 评论 复制链接分享
  • zyn010101 zyn010101 8年前

    问题很有迷惑性,由于知识面过窄造成的误解,oracle强大的功能之一就是对sql进行自动优化,执行效率最高的sql,这个分页中 oracle会自动把外层的条件放到内层去提高sql的执行效率,详细介绍可以参考:[url]http://wenku.baidu.com/view/db92f8ef102de2bd960588ae.html[/url]

    点赞 评论 复制链接分享