Oracle資料庫查詢高效分頁

2021-09-30 21:58:14 字數 1649 閱讀 5504

由於網頁渲染速度的影響,在c/s程式中那種乙個grid包含幾千、上萬行的資料基本上在網頁是無法展現的,因此一般採用分頁的形式顯示(也可能採用visual srolling方式載入的,企業應用系統的不是很常見),asp.net 的資料控制項一般帶有分頁功能,3.5以後還提供了單獨的分頁控制項,也有用過aspnetpager這個第三方的元件。

分頁的控制項實在很方便,以前的處理方式就是資料都拿出來,然後由控制項進行處理,一般資料量不大的時候應該說感覺不出來優劣,但由於每次從資料庫取的時候都是取所有的資料,肯定會增加資料庫的壓力,傳輸的資料庫多了對網路頻寬也會產生壓力的。很有可能查出來1萬條資料,最後顯示只用到啟用50條,翻頁的時候又重新去查1萬條資料,顯示之後的的又50條。

以下的分頁sql比較常見的,在sql server也有對應的使用top關鍵字的版本,記得剛學oralce的時候就想著怎麼不能rownum between minvalue and maxvalue的用法。與最初的疑惑的原理一樣,rownum是在查詢過程中生成的,因此以下的sql其實是查出來5300行,然後扔掉了前面5000行,返回後面的300行。當然這種已經進了一大步的,由資料庫返回的資料變少的,只是當查詢的頁數比較大的時候,查詢還是存在一定的浪費。

select * 

from (select a.*, rownum as rnum 

from (select * from yz_bingrenyz) a 

where rownum <=5300) 

where rnum >= 5000

linq提供了skip和take的api可以用於分頁,由於使用的是entity framework,在好奇的驅使下用efprofiler檢視生成的sql,才知道這樣以下分頁更好。 主要就是使用了row_numer()over()這樣的分析函式,可以直接找到那第5000行開始的地方,然後在取出30行就行了。

select * 

from (select * 

from (select t.*, 

row_number() over(order by null) as "row_number" 

from yz_bingrenyz t) p 

where p."row_number" > 5000 

) q 

where rownum <= 30

比較分析:

本機測試前者耗時1.3s,後者僅0.25s,從以下的執行計畫也能看出差異來。

實際應用

如果每次查詢都要寫這種sql那肯定比較麻煩,可以採用儲存過程進行封裝,但由於要動態執行sql,效率肯定又要打折扣,所以在asp.net中用c#封裝函式比較好,對於沒有使用實體框架的而用ado.net的,傳入表名 、主鍵名、頁數、要取的行數作為引數,用dbcommand進行執行返回結果即可。

***********************************=分割線******************************==

Oracle資料庫查詢高效分頁

由於網頁渲染速度的影響,在c s程式中那種乙個grid包含幾千 上萬行的資料基本上在網頁是無法展現的,因此一般採用分頁的形式顯示 也可能採用visual srolling方式載入的,企業應用系統的不是很常見 asp.net 的資料控制項一般帶有分頁功能,3.5以後還提供了單獨的分頁控制項,也有用過a...

Oracle資料庫查詢高效分頁

由於網頁渲染速度的影響,在c s程式中那種乙個grid包含幾千 上萬行的資料基本上在網頁是無法展現的,因此一般採用分頁的形式顯示 也可能採用visual srolling方式載入的,企業應用系統的不是很常見 asp.net 的資料控制項一般帶有分頁功能,3.5以後還提供了單獨的分頁控制項,也有用過a...

Oracle資料庫分頁查詢

想要理解oracle資料庫的分頁就要先知道什麼是rownum 1 rownum是oracle專用的關健字 2 rownum與表在一起,表亡它亡,表在它在 3 rownum在預設情況下,從表中是查不出來的 4 只有在select子句中,明確寫出rownum才能顯示出來 5 rownum是number型...