程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 如何在SqlServer與oracel進行分頁的討論!

如何在SqlServer與oracel進行分頁的討論!

編輯:關於SqlServer

使用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.*,

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved