註冊 | 登入 | 全文檢索 | 排行榜 |
![]() |
» JWorld@TW
» Servlet/JSP 討論區
![]() ![]() |
![]() ![]() ![]() ![]() |
本主題所含的標籤 |
作者 | 大家是否可以提供 寫分頁的方式~ [精華] |
823029
![]() ![]() ![]() ![]() ![]() ![]() 發文: 28 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 如標題~ 不好意思 現在有需要一個可以參考的分頁程式~或者物件 需要大家的幫忙 謝謝 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
snpshu
![]() Norman 版主 ![]() 發文: 1073 積分: 5 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 參考一下 http://www.javaworld.com.tw/jute/post/view?bid=6&id=1361&tpg=1&ppg=1&sty=1&age=0#1361 多利用search , 這一個站很多資源等你挖掘 ![]() ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
browser
![]() 戀香 版主 ![]() 發文: 3570 積分: 1 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=8893 各位高手們 .... 可以說一下你們的經驗嗎 .... 大家是徒手自行打造 ... 還是有發現到好用的 api or tag ..... ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
java4by4
![]() ![]() ![]() ![]() ![]() ![]() 發文: 7 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 原理如下: 將所有的資料先取出來,寫到檔案中,檔名用session id。 每一行一筆資料,然後呢,換頁就到該暫存檔中找,大 概這樣。 這是換了幾個寫法後,覺得比較好的,反正現在的硬碟 速度都不慢。 用cursor、物件存等,到流量大時,問題就來了。 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
prometheus
![]() 理智就像剝了皮的野獸 ![]() ![]() ![]() ![]() ![]() 發文: 136 積分: 1 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 用MySql的話直接用limit就搞定囉!! ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:stallone_hwang] |
arthuroy
![]() ![]() ![]() ![]() ![]() ![]() 發文: 106 積分: 3 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 分頁不僅是在 JSP-based application 用的到,swing-based 也很需要呢。 # Jeremy Dickson. "Java Tip 137: Manage distributed JTables - Efficiently display huge JTables using distributed caching TableModels." JavaWorld. April 18, 2003. http://www.javaworld.com/javatips/jw-javatip137_p.html # Tim deBoer. "Displaying Tables in JavaServer Pages." IBM WebSphere Developer Domain. May 2000. http://www7.software.ibm.com/vad.nsf/Data/Document2342?OpenDocument&p=1&BCT=66 # Java 訪問數據庫的速度瓶頸問題的分析及解決. IBM developerWorks 中國網站. November 2001. [GB2312] http://www-900.ibm.com/developerWorks/cn/java/l-dbperform/index.shtml --- comparison on Data Access Object (DAO), Fast Lane Reader (FLR), and Page-by-Page Iterator (PPI). # 數據庫批量查詢分頁的完美解決之道. J 道論壇. 2002-09-26. [GB2312] http://www.jdon.com:81/jive/thread.jsp?forum=16&thread=1591 # 用標準的 SQL 語句實現查詢記錄的分頁. JavaResearch Organization. 2002-09-05. [GB2312] http://www.javaresearch.org/article/showarticle.jsp?column=108&thread=2028 # Ryan Brase. Deciding between iterators and lists for returned values in Java. August 14, 2002. http://builder.com.com/article.jhtml?id=u00220020814R4B01.htm # 查詢數據庫後是返回 ResultSet還是返回 Collection. J 道論壇. 2002-08-21. [GB2312] http://www.jdon.com:81/jive/thread.jsp?forum=16&thread=302 ![]() ![]() Self-Pity I never saw a wild thing sorry for itself. A small bird will drop frozen dead from a bough without ever having felt sorry for itself. |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
gucci
![]() ![]() ![]() ![]() ![]() ![]() 發文: 98 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 用MySql的話直接用limit 那oracle呢??? ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:gucci] | ||
systempanic
![]() ![]() ![]() ![]() ![]() ![]() 發文: 216 積分: 4 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() gucci wrote: 用ROWNUM, for example:
摘錄自Bitter EJB, p.104 ![]() ![]() NaN |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] | ||||
gucci
![]() ![]() ![]() ![]() ![]() ![]() 發文: 98 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 我整理一下大家的討論 1. Oracle數據庫使用關鍵字:rowid或rownum 2. DB2:rowid或rownum () 3. PostgreSQL 使用LIMIT 和 OFFSET 4. MySQL 使用Limit 5. MS SQL Server 沒有提供此技術 EX: oracle中,若只希望返回前十行紀錄
若是希望返回91-100筆紀錄
那這樣的話 若我的db是採MS SQL 不就得一次把查詢的結果存到ResultSet嗎??? 我有一個project 那樣的效能有點差說 有沒有什麼解決的辦法 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] | ||||||||||
gucci
![]() ![]() ![]() ![]() ![]() ![]() 發文: 98 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() Q:如何使用rownum進行分頁? A: 下面是我們單位開發人員提出的分頁方法: 「更為簡單、清晰的ORACLE分頁SQL:
下面是我的回復: 這樣的SQL是令人擔憂的! 原因基於兩點: 1、我們知道rownum是oracle輸出結果中的虛行,即在實際的表中並沒有相應的存儲結構存在; 2、minus運算是在兩次操作結果的基礎上進行的,因此在非不得不的情況下,我們一貫主張避免使用類似的操作; 由此可以看出樓主提出的SQL:
為了取出100條紀錄實際上執行了兩次SELECT共300條紀錄,舉個簡單的例子,如果共1000條紀錄,分頁為100條,那麼全部SELECT總數據量是 100+(200+100)+(300+200)+。。。 共是10000條,整整是10倍的數據量!如果是幾萬、幾十萬的數量級,再加上實際操作中的ORDER BY以及相關的WHERE條件,更不敢想像這樣SQL的效率。 在實際中針對分頁比較典型的做法是:
這裡有三個變量: &myname where條件 &maxrnm要查詢的最大行號 &minrnm要查詢的最小行號 使用這樣的SQL在8i以後ORACLE是使用專門的優化來處理的,它需要排序字段預先建有索引,由於索引是已排序好的結構,因此取TOP n的問題,就變為從索引中直接從頭提取n個索引關鍵字,然後再根據索引就可快速的找到記錄並返回給用戶。從而有效避免了檢索全部記錄的情況。 按分頁計算,如果用戶很少瀏覽後面頁面的數據使用上面的SQL效率是很好,否則到某一刻index range scan所有滿足條件記錄時帶來的高成本,CBO甚至認為它高於FULL TABLE SCAN而選擇FULL TABLE SCAN。為了避免這一情況,針對經常需要瀏覽後面分頁數據的用戶,可以使用下面的SQL來處理:
在這一方法中,我們考慮到索引與表相比,數據量大大小於後者,因此我們試圖先在索引中搜索出某頁記錄的物理位置,然後根據這些物理位置(rowid)在表中直接取出相應的記錄,這將有利消除上述FULL TABLE SCAN的出現。 當然二者之間的選擇要看我們的實際應用以及我們INDEX的情況,以便更好地提高效率。 另外一種做法在ORACLE8.1.6之後可以使用row_number() over()函數來實現:
有人可以解釋一下上面這個SQL語法嗎? 引述自http://wolf-lab.com/cgi-bin/view.cgi?forum=13&topic=36 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:arthuroy] |
cherrie
![]() ![]() ![]() ![]() ![]() ![]() 發文: 2 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 這篇大家也可參考看看. http://www.jdon.com/product/muiltipagequery.htm ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:cherrie] |
arthuroy
![]() ![]() ![]() ![]() ![]() ![]() 發文: 106 積分: 3 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() DisplayTag: # Pageable DisplayTag with Hibernate by Xexex. April 29, 2004. # htmltable 和 displaytag [本站精華] ![]() ![]() Self-Pity I never saw a wild thing sorry for itself. A small bird will drop frozen dead from a bough without ever having felt sorry for itself. |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
lonely
![]() JSP@ASIA.COM ![]() ![]() ![]() ![]() ![]() 發文: 69 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() PL-SQL 可使用 rownum 進行分頁。 T -SQL 可利用上頁的最後排序值以及 TOP 關鍵字。 另類做法,第一次捉資料時 把所要的資料全捉來放到 session 裡。 可以先放到 array 或 linklist 等元件裡,再放到 session。 然後看USER轉到第幾頁,再把 session 裡的資料拿出來、「切」出來 show 給 User 看 就好了。 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
lonely
![]() JSP@ASIA.COM ![]() ![]() ![]() ![]() ![]() 發文: 69 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 講到效率 . . . 有時使用 PL-SQL 的 巢狀 Select 語法、 去繞出來所要的資料區段 . . . . 真是慢的可以 ~ T-SQL 的寫法 感覺好多了。 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
ROACH
![]() ![]() ![]() ![]() ![]() ![]() 發文: 64 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 想問一下啊 我公司是用as400的系統~應該是db2的資料庫 可是我發現他好像不支援TOP~ㄟ~ 因為我直接在AS400打SQL語法~結果都不行 就連rowid()或rownum () 也不支援~~ 那還有什麼其他的~分頁方法ㄋ~ 因為我現在是用rs.absolute()定位的方式~ 但是總覺得好像很慢的樣子~ ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
lonely
![]() JSP@ASIA.COM ![]() ![]() ![]() ![]() ![]() 發文: 69 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() SQL 語法、講是講放諸四海而皆準啦 ~ 當然這個 SQL 是指 SQL-92 而言 ( 是吧 !? ) 各個 廠商可以再延伸 所以囉 有 PL-SQL T-SQL . . . . TOP 這個是 T-SQL 的東西 適用於 MS$ 的產品、 DB2、IBM 的東西吧 ~ 當然 不見的用得上 ! ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
lonely
![]() JSP@ASIA.COM ![]() ![]() ![]() ![]() ![]() 發文: 69 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() rowid()、rownum () ORACLE 的東西 ! IBM 當然也不見得喜歡跟著別家廠商走 ! 所以囉 ~ 各位程式師 才有的玩囉 ! ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
paulma
![]() ![]() ![]() ![]() ![]() ![]() 發文: 76 積分: 5 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() DB2 類似T-SQL 的TOP N 的用法如下, 請參考: SELECT * FROM TABLENAME WHERE COL=VALUE FETCH FIRST N ROWS ONLY N為任意數字 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:823029] |
JackTasy
![]() ![]() ![]() ![]() ![]() ![]() 發文: 8 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 提供一個經驗和想法給大家參考(不限資料庫種類): 1.若可以定義排序欄位的話最好 2.若沒有的話則利用 self join 技巧動態產生虛擬排序編號(就算資料庫沒有定義 PrimaryKey 一樣可以產生),然後分頁頁次用程式技巧可算出需取出虛擬編號起止號碼,然後加在 SQL where 即可。 ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:JackTasy] | ||||||
frank
![]() 版主 ![]() 發文: 498 積分: 13 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() JackTasy wrote: 假設 RDBMS 提供類似 sequence (如 Oracle) 的方法當然是最方便的, 如無,據 JackTasy 兄的建議, 我試了下面的做法: ============================================ 假設有個學生資料的 table 叫 student{id(PK), name, score}, 欲將分數由高至低排序,取出第 11 至 20 名 1. 首先 self join 技巧動態產生虛擬排序編號
2. 求得第 11 至 20 名之 id
3. 求得該 id 區間之資料
============================================ 我分別透過 Aqua Data Studio 3.5 在 Oracle 9i 及 MySQL 上測試(皆為遠端主機, table 內約有 10k 筆資料),這樣子的確也可達到需求, 可是,在第一段 SQL 執行時, Oracle 所花時間尚能接受, MySQL performance 就差很多了 請問各位,上面的 SQL statement 該如何調整比較好? ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:frank] | ||||
frank
![]() 版主 ![]() 發文: 498 積分: 13 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 這裡僅整理 Hibernate 2.1.4 使用之 SQL,供有需要的朋友參考: 分頁查詢語法 假設有個學生資料的 table 叫 student{id(PK), name, score}, 若想依分數高低取出所有資料,我們會這麼下 SQL statement, SELECT * FROM student ORDER BY score DESC 但是,若想取出 1. 分數排名在前 10 名的學生資料, 2. 分數排名在第 11 名至第 20 名間的學生資料, 在各個 DBMS 中,我們應如何下該 SQL 指令? 透過下面程式:
可以得到下面的 SQL statement
![]() ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:frank] | ||||||
JackTasy
![]() ![]() ![]() ![]() ![]() ![]() 發文: 8 積分: 0 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() frank wrote: 1.請教一下,你的 MySQL 是用哪一版的呢? 作業系統是...? 因為就我所知 MySQL 3.23-58 之前還無法支援 SubQuery 功能的喔,害我要寫一堆程式來克服,若新版可以的話我就可以更新嘍! 2.SubQuery 本來就是最耗資源的做法,據我的經驗尤其在 Oacle 8i 更是讓我望而怯步,很多地方寧願用程式來解決呢。 3.據我所知 SQL 指令動態產生虛擬欄位必須用 self join 不可,看來第一段可能別無他法...(但仍希望有其他 SQL 技巧解法..)|) ![]() ![]() |
作者 | Re:大家是否可以提供 寫分頁的方式~ [Re:JackTasy] | ||
frank
![]() 版主 ![]() 發文: 498 積分: 13 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() JackTasy wrote: MySQL Manual 14.1.8 Subquery Syntax
![]() ![]() |
|
» JWorld@TW » Servlet/JSP 討論區 |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() |