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

MSSQL
SQLSERVER 中datetime 和 smalldatetime类型分析说明
数据库清除日志文件(LDF文件过大)
按日期选择最晚日期与最早日期对应的数的差值
sql 时间函数 整理的比较全了
SQL Server全文检索查询浅析
SQL 存储过程基础语法之一
SQL Substring提取部分字符串
用户"sa"登陆失败 SQLServer 错误18456的解决方法
MSSQL 检查所使用的语句是否符合标准
drop,truncate与delete的区别
SQL语句查询数据库中重复记录的个数
SQL 导入导出Excel数据的语句
可以获取客户端的IP地址的sql语句
SQL 根据汉字获取全拼的代码
sqlserver exists,not exists的用法
sqlserver substring函数使用方法小结
sql 判断数据库,表,存储过程等是否存在的代码
做购物车系统时利用到得几个sqlserver 存储过程
Sql2000数据库的备份文件恢复到Sql2005的方法
sql 分组查询问题

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 57 ::
收藏到网摘: 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