当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 如何在SqlServer与oracel中进行分页的讨论!

MSSQL
实现按部门月卡余额总额分组统计的SQL查询代码
浅议Oracle中的进制转换
sqlserver MSDTC的设置要点
小议主子表INT自增主键插入记录的方法
使用SQLSERVER的扩展存储过程实现远程备份与恢复
SQL安装问题总结
使用XML封装数据库操作语句的实现
SQL Server与Excel数据互导
查询sql遇到deadlock问题的解决
解决sqlsever日志备份错误的方法
关于sql数据库维护失败的问题查找方法
跟日期有关的两条经典SQL语句
使用链接服务器执行远程数据库上的存储过程
select用存储过程返回的表
SQL SERVER与ACCESS、EXCEL的数据转换
榨干MS SQL Server 最后一滴血
SQL Server 2005: 利用新的ranking函数实现高效的数据分页操作
在SQL Server 中使用SQLDMO
SQL Server补丁版本的检查和安装过程中常见问题
SQL高手篇:精妙SQL语句介绍

MSSQL 中的 如何在SqlServer与oracel中进行分页的讨论!


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 108 ::
收藏到网摘: n/a

 

使用sql,和oracle数据库进行分页可以有以下三种方法!


下面让我们看一看如果我们要在数据库中取第1000条到第1010条的数据这两种方法是怎么实现的.


1.        使用临时表的方法. (在系统中主要是直接写Sql语句来做)

 

a)          按所需的排序方式排好序

 

b)         创建临时表

 

c)          从数据库里取出第0条 到 第1010条的数据

 

d)         把这些数据放入临时表中

 

e)          把临时表再按与 a) 相反的排序方式排好序

 

f)          然后只需把临时表中的前10条显时出来

 

g)          销毁临时表

 


 


2.        使用 object 的方法

 

a)          按所需的排序方式排好序

 

b)         从数据库里取出第0条 到 第1010条的数据

 

c)          倒着从这1010条数据中取10条 放入一个 object中

 

d)         把这个 object里的记录 完全倒置一下

 

e)          把 object里的数据显示出来

 


 


显然 第二种 方法优于第一种方法 它减少了系统创建, 销毁临时表所需耗费的资源, 但是它们都有一个共同的弱点. 那就是 它们都要从数据库里取出第0条 到 第1010条的数据  这样就造成了 查询出的记录数很少,但网络传输数据量很大!

 


 


因此比较好的分页做法应该是:

 

每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。

 


 


对于SqlServer 数据库 如要到得第1000-1010条记录:

 


 


Select top 10  * from (

 

Select top 10  * from (

 

     Select top 1010 * from docdetail order by lastmodidate asc ,Id asc

 

) temptbl1 order by lastmodidate desc ,Id desc

 

) temptbl2 order by lastmodidate asc,Id asc

 

对于oracle 数据库 如要到得第1000-1010条记录 由于oracle中的rownum是在查询之后排序之前赋值的.所以其相应的写法应为:


 select * from (

 

         select my_table.*, rownum as temptbl_rownum from (

 

                   Select * from docdetail order by lastmodidate asc,Id asc

 

      ) temptbl where rownum <1010

 

 ) where  temptbl_rownum >=1000

 

 

当以上的Sql语句执行完成以后, 网络传输数据量就从以前的1010条减少到 10条


通过以上分页方式的改变,对我们系统的性能有很大的提升


我有个客户使用的是oracel数据库 其中文档数目为 12万条 ,当我们对这张表时行搜索的时候 使用第一种方法进行分页时,页面显示的时间约为10秒左右,而使用第三种方法而现在页面显示时间只需要2-3秒左右.

 

当然,可能还有更好的分页方法,总觉得随着数据库里的数据的不断增加,系统运行的速度将会变慢,我在这里贴出这篇文章,只是想和大家讨论一下,还有没有更好的方法, 希望大家不吝回复! 一起讨论!


:D (完)


[点击此处收藏本文]
发表于 2005年04月12日 9:35 AM


随便说说 发表于2005-04-14 2:42 PM 
1.
select my_table.*, rownum as temptbl_rownum from (
Select * from docdetail order by lastmodidate asc,Id asc
) temptb