国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:31:21
字體:
來源:轉載
供稿:網友

使用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
) temptbl where rownum <1010 and rownum >=1000

2.
select * from docdetail rownum <1010
minus
select * from docdetail rownum <1000


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 崇文区| 稻城县| 长垣县| 开江县| 睢宁县| 阿城市| 聂荣县| 安国市| 云安县| 江城| 兴和县| 陈巴尔虎旗| 雅安市| 丹凤县| 荔波县| 枝江市| 铁岭县| 读书| 南雄市| 溧阳市| 绥德县| 樟树市| 海淀区| 龙江县| 云梦县| 柘城县| 个旧市| 斗六市| 临城县| 泗洪县| 行唐县| 宁夏| 峨山| 定陶县| 抚宁县| 彰武县| 沙洋县| 桂东县| 沙坪坝区| 乌兰察布市| 邻水|