對大量資料的分頁處理
問題描述:
背景1:一客戶通過ie請求web伺服器查詢資料,而查詢結果是上千條甚至是上萬條記錄,要求查詢結果傳送到ie客戶端並分頁顯示。
背景2:一客戶通過ie或者其他方式請求web伺服器查詢資料,而查詢結果是上千條甚至是上萬條記錄,並要求查詢結果把包傳送到客戶的e-mail中。
問:對於這樣的有大量資料的結果集,在web伺服器端如何有效的處理?
可能涉及到的問題:
1. 記憶體占用
大量資料的結果集,可能要
2. 傳輸速度及策略
具體的分頁處理技術
序號 名稱 處理方法 針對的資料庫 例子說明 備註
1 游標查詢 直接使用resultset來處理。resultset是直接在資料庫上建立游標,然後通過resultset的行位置定位介面來獲得指定行位置的記錄。
當使用者第一請求資料查詢時,就執行sql語句查詢,獲得的resultset物件及其要使用的連線物件都儲存到其對應的會話物件中。
以後的分頁查詢都通過第一次執行sql獲得的resultset物件定位取得指定行位置的記錄。
最後在使用者不再進行分頁查詢時或會話關閉時,釋放資料庫連線和resultset物件等資料庫訪問資源。
說明:在用例分頁查詢的整個會話期間,乙個使用者的分頁查詢就要占用乙個資料庫連線物件和結果集的游標,這種方式對資料庫的訪問資源占用比較大,並且其利用率不是很高。 所有的資料庫產品。 優點:
減少了資料庫連線物件的多次分配獲取,減少了對資料庫的sql查詢執行。
缺點:占用資料庫訪問資源-資料庫連線物件,並占用了資料庫上的資源-游標。而這些資源都是十分寶貴的有限制的。
結論:這種的資料庫查詢分頁處理方式不是最佳的。一般不適用這種方式。
2 定位行集sql查詢 主要是直接使用資料庫產品的提供的對查詢的結果集可定位行範圍的sql接**術。
在使用者的分頁面查詢請求中,每次可取得查詢請求的行範圍的引數,然後使用這些引數生產取得指定行範圍的的sql查詢語句,然後每次請求獲得乙個資料庫連線物件並執行sql查詢,把查詢的結果返回給使用者,最後釋放說有的資料庫訪問資源。
說明:這種方式需要每次請求時都要執行資料庫的sql查詢語句;對資料庫的訪問資源是使用完就立即釋放,不白白占用資料庫訪問資源。 對特定(提供了對查詢結果集可定位功能的)的資料庫產品。
如:oracle,db2, postgresql,mysql等。(ms sql server 沒有提供此技術。) 如:
1. oracle資料庫使用關鍵字:rowid或rownum
2. db2:
rowid或rownum ()
3. postgresql 使用limit 和 offset
4. mysql 使用limit 優點:
這種技術是直接使用資料庫產品自己提供的可對查詢結果集定位行範圍過濾的功能,因此直接利用了資料庫的效能對此分頁查詢的優化功能。
對資料庫的訪問資源(資料庫連線物件,資料庫游標等)沒有浪費,這些資源的充分重複的利用。
對查詢的結果對web容器沒有什麼特別要求。
缺點:要執行多次資料庫sql查詢操作。對每次的分頁面操作請求都要指定相應範圍的結果集來執行sql語句的資料庫查詢操作,這對資料庫有一定的影響。
對每次分頁面查詢請求要頻繁的從web容器中獲得資料庫訪問資源(資料庫連線物件和資料庫游標)。
要依賴於具體的資料庫產品。因為對沒有實現沒有提供此技術的資料庫產品不能使用此方式。
結論:由於每次對資料庫的sql查詢操作相對而言耗用的資料資源比較少,並且在實際使用者的操作中,有可能使用者對查詢的所有結果集只是需要檢視其中的部分頁面。
因此這種方式是最佳的。
3/ 特別處理的定位行集sql查詢 這種方式是在方式2的基礎上針對不提供對查詢結果集行範圍定位的資料庫產品。
其在web容器端的操作邏輯大致和方式2相同。
只是先要對要查詢的資料庫表要有一字段的資料能區別每條不同的資料記錄。第一次查詢時,獲得用來可唯一標識不同記錄的字段的所有結果集,並快取起來以備後面的分頁面查詢指定要查詢的結果集的行範圍。 主要是針對不同對查詢行集可定位範圍獲得的資料庫產品,如ms sql server等。 假設從a,b,c三個表中選取資料。且a有欄位id用來可唯一區別不同的記錄。
那麼第一次查詢的時候,會查詢兩次1. select a.id from a,b,c where condition.
2. 把a的id快取到session中⾿3.從session中。現可按照次序來取得相應頁面範圍的id來,並構造下乙個查詢語句:select a.name, b.add from a,b,c where condition && (
a.id in 本頁面範圍的 id )
以後每次翻頁的時候,依次獲得對應頁的id只要表中唯一的就可以了。無所謂大小,順序⾿這樣,sesssion快取的就只是一列而不是所有列了。當然,對於列數不多的,效果並不好。
也可使用儲存過程實現,可參照:http://expert.csdn.net/expert/topic
/2365/2365596.xml?temp=.7529261
優點:同方式2
缺點:同方式2;
還要在要查詢的資料庫表中建立乙個相應的id,用來唯一區別每條記錄。
結論:同方式2。
快取一次sql查詢的結果集 優點:
缺點:既然我們要快取結果,那麼使用者就可能會看到過期的資料
說明:對於實際情況的應用來說,一般結合實際情況,結合使用方式2(或方式3)和方式4。如:乙個應用場景:對公司的產品的查詢是經常的,但是產品的種類不是很多,這時可使用快取方式;但是對有些查詢結果集較大,資料庫和web容器之間的網路訪問由可能是遠端的,這時候可考慮使方式2(或者方式3)。
Java分頁查詢(真分頁)
在開發過程中,我們經常會從資料庫中查詢資料,然後在客戶端顯示出來。當資料少時,可以在乙個頁面顯示。當我們查詢幾百條以上資料,直接顯示在乙個頁面上,不僅瀏覽不方便,查詢效率也會受到影響,這是,我們就可以使用分頁查詢來解決這個問題。分析上面這個頁面,想要實現分頁,我們在頁面中需要顯示的資料有 本頁的資料...
Java 分頁與多條件查詢
與分頁一樣需要兩條查詢語句分別查詢總行數與分頁後的資料,區別是查詢分頁的時候結尾的 去掉如下 private string selectsuppliercount select count count from pw supplier tbsupplier join sys datasources ...
python分頁查詢 分頁查詢
分頁 使用select查詢時,如果結果集資料量很大,比如幾萬行資料,放在乙個頁面顯示的話資料量太大,不如分頁顯示,每次顯示100條。要實現分頁功能,實際上就是從結果集中顯示第1 100條記錄作為第1頁,顯示第101 200條記錄作為第2頁,以此類推。因此,分頁實際上就是從結果集中 擷取 出第m n條...