分頁處理是在web開發中經常遇到的問題,對於不同的分頁方式,在負載較高的情況下會產生極大的效能差異,一般來說,分頁的處理方式分為兩種,一種是程式分頁,即從資料庫中取出記錄集之後,使用迴圈擷取的方式取得需要的資料,一種是通過資料庫提供的分頁功能即sql的技巧來處理,後者在負載較高的情況下會提供良好的效能,尤其是在資料量較多的情況下,下面簡單介紹一下這兩種方式的實現
我使用乙個示例表
create table student
(id int not null primary key,
name varchar(20) not null ,
code varchar(20),
description varchar(100)
)這個在不同的資料庫中都可以實現,在oracle中最好修改varchar 為varchar2
設定我們取第10頁的資料,每頁10行,即取91-100行的資料
1、程式分頁
我們以asp為例,
sql = 「select * from student「
set rs = conn.execute(sql);
i=0;
do until rs.eof or i>100
i=i+1
if i>90then
response.write rs.....
end if
rs.movenext
loop
這樣做的問題就是每次要從資料庫中取出所有資料,然後遍歷,這樣在壓力大的時候會在資料庫和應用伺服器之間產生非常大的資料互動,尤其是取後面的資料時,效率極低
2、資料庫分頁
這種方式的處理優點是充分發揮資料庫的優勢,只取出需要的資料,下面介紹不同的資料庫的處理方式
1)oracle
在oracle中我們利用rownum的特性來處理這類問題,如
select * from (
select rownum rid,a.*
from student a
)where rid between 91 and 100
如果是複雜的sql,我們只要在sql的select後面加上rownum id,然後在外層sql中使用類似的結構就可以了,要注意的是目標sql中的欄位名不要和rid重複,如果想批量使用的話,可以採用乙個冷門的字段。
一般來說,您可以將目標sql去掉select,這段字串設為area_sql,然後
select * from (
select rownum rid,area_sql)
where rid between 91 and 100
還有另外一種方式處理這種問題,使用minus,如下
select * from student
where rownum<101
minux
select * from student
where rownum<91
採用minus的過率功能,這樣的好處是更容易模組化、更通用,但效率稍低
在asp中這麼呼叫
set rs = conn.execute(sql);
do until rs.eof
reponse.write rs......
rs.movenext
loop
2)sql server
在sql server中處理這種問題麻煩,因為sql server中沒有提供偽列的功能,也沒有篩選的功能,
所以想達到oracle同樣的效果,必須寫儲存過程來解決,而且沒有通用性,需要對每個表書寫儲存過程,儲存過程在這裡就不介紹了,能產生一定效果的方法是
select top 100 *
from student
然後用程式分頁的方法來處理問題,這樣效率在取後面的資料效率也很低,在取前面資料的時候可以體現出優勢
3)mysql
mysql 是乙個開發原始碼資料庫,速度較快,但缺乏很多必要的功能,但在小型web頁面中已經夠用了
它的分頁系統處理問題如下
select *
from student
where .....
limit 90,10
limit函式是這樣處理的,第乙個引數是起始行,第二個引數為讀取的行數,這樣就取出了91-100行的資料,
mysql的處理方式非常靈活,而且也容易模組化,只要修改起始行即可,
在php中如下
$rs = mysql_query(sql);
while($line = mysql_fetch_array($rs))
漫談資料庫
談到資料庫這個詞,我想無論是菜鳥還是高手都不會感到陌生。隨著資訊化時代的到來,資料庫已被廣泛運用於各類電腦網路和管理系統中。如果沒有資料庫的話,今天的網際網路就不會這樣 絢麗多姿 我們所看到的企業管理系統將只能成為一種電腦的裝飾品。我有不少朋友,雖然他們對資料庫各有自己的看法,但在有一點上是達成共識...
資料庫驅動的連線方式
1 oracle8 8i 9i資料庫 thin模式 class.forname oracle.jdbc.driver.oracledriver newinstance string url jdbc oracle thin localhost 1521 orcl orcl為資料庫的sid strin...
幾種SQL Server資料庫分頁方式
photosprite 建立表 create table testtable id int identity 1,1 not null firstname nvarchar 100 collate chinese prc ci as null lastname nvarchar 100 collat...