张昊

J-Hi(http://www.j-hi.net)

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  45 Posts :: 1 Stories :: 110 Comments :: 0 Trackbacks
  因为目前很多企业用SpringJDBC框架做数据访问层,通过调查应大家的要求目前我正在做将SpringJDBC融入J-Hi平台的工作。
  在以前我还真没对各数据库的翻页处理做深入的分析,只是肤浅的知道SQLServer用top,Oracle用rownum,MySQL用limit通过sql语句做分页处理,我一直认为通过对应数据库的这些关键字就可以获取指定的数据条数,而这些数据是在数据库端就可以一次完成的。例如只取满足条件的第11-20这10条记录,这样ResultSet就会只有10条结果,而事实并非如此,主要就纠结在SQLServer上。
  通过做J-Hi对SpringJDBC融合的开发,我才知道实际上SQLServer2000并不能满足我们这样现实的需求,而只有到了SQLServer2005这个局面才有了改观,下面让我们对SQLServer的分页处理做如下分析:

   SQLServer2000,由于它只提供了top关键字,而top的作用只是满足条件的前多少条记录,因此在处理翻页时,它是将满足条件的前多少条记录一并取出,如每页10条,翻到第二页时的sql语句为
select top 20 HI_Org.* from HI_Org HI_Org
   也就是说会把前20条记录一次性丢给java形成20条记录的结果集,而对我们来说因为是第二页每页10条,所就是说只要这20条记录的后10条,前10条是没有任何意义的垃圾数据,这样的处理机制不但效率会大大降低,而且随着页数的增加,比如我们要翻到第1000页,那在结果集中就要有10000条记录,因此也造成了资源的浪费。大家由此会推算出来,越往后翻页,性能就越低。这种性能的低下不只是无用数据量的增加,而且也造成了对这些无用的数据处理的时间损耗。

   搞笑的时,用了这么久的SQLServer却昏然不知,等到SQLServer2005微软才算时对此做了补充与修改,下面是SQLServer2005的SQL语句        

WITH query AS (select ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMPas __hi_row_nr__, hi_org.* from hi_org hi_org) SELECT * FROM query WHERE __hi_row_nr__ BETWEEN 11 AND 20
   通过上面的语句我们可以看出SQLServer2005提供了ROW_NUMBER()方法[这个方法有点象oracle的rownum,也许微软对于这个功能就是抄习的甲骨文也不一定,哈哈],以记录结果集的行数,不过还是点恶心,如果用之个方法还必须进行排序处理,如果没有order by作修饰这个方法还是无效的。

    通过上面的一个小功能的分析,我真是对微软及SQLServer产品有些失望,如此的功能要事隔5年才完善它,而且完善的并无新意,更何况象这样的功能就连mysql这种免费开源的产品都早已实现,而SQLServer还是商业运作,真不知微软的SQLServer在某些方面上都不如开源的产品它是做何感想?
  


posted on 2011-04-17 21:30 张昊 阅读(2373) 评论(3)  编辑  收藏

Feedback

# re: J-Hi 开发日记(一) 2011-04-19 09:29 durex
以前还真没有注意,有同感  回复  更多评论
  

# re: J-Hi 开发日记(一) 2011-04-22 10:13 chenlin
与DB2一样,不是抄Oracle的  回复  更多评论
  

# re: J-Hi 开发日记(一) 2011-04-22 14:45 张昊
@chenlin
我对DB2不了解,谢谢指教  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: