當前位置:首頁 » 數據倉庫 » 資料庫分頁演算法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫分頁演算法

發布時間: 2022-05-22 12:57:41

sql的幾種分頁演算法

利用SQL語句分頁要看你用的什麼資料庫
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。

Ⅱ java面試的時候問到如何實現分頁

分頁的實現可分為兩大類相信你也懂得這個,一、數據在Java代碼中進行分頁,然後取得當前頁數據;二、在資料庫中直接取得當前頁數據。
通常面試官都希望聽到後者,因為那才是高效的方法。你如果想讓面試官覺得你的能力高的話你就先否定他的問題,你可以回答說:「Java中根本不需要做分頁的實現代碼只管拿資料庫中的當前頁數據即可,數據分頁功能應該交由SQL處理,在分頁實現中Java最多隻實現總頁數的計算,除此以外幾乎不用管。」如果你這么答的話面試官通常會問你總頁數的演算法,至於這個你可以網上找個高效點的方法,我現在知道最高效的就是:(數據總行數+每頁數據行數-1)/每頁數據行數。
演算法可能有更高效的,你可以到網上找找。記住只在面試中才能這么答,筆試的話老老實實寫出實現方法。否定面試官的問題會讓他覺得你更professional,但不要太囂張不然適得其反的。
通常面試如果他狂問我代碼實現的話我都會要回簡歷走人,因為他們需要的只是一個Coder。

Ⅲ 請問,如果從一個新聞資料庫查詢的文章內容太長了,想分頁該怎麼做

分頁瀏覽功能是常見的Web應用功能,對於MySQL資料庫來說可以很輕松的使用limit語句實現分頁,而對於SQL Server資料庫來說,常見的方法是使用數據集本身的游標實現分頁,這種方法對於少量數據來說沒什麼問題,但是對於稍大一點的數據量,例如幾十萬條數據,則查詢速度會降低很多,這里我介紹一種常用的技巧,只要簡單的重新構造一下查詢SQL語句,就能大幅提高查詢性能的方法。 在分頁演算法中,影響查詢速度的關鍵因素在於返回數據集的大小,我們先在數據表中設置一個名為id的主鍵,數值為自增量的整數,然後通過重構查詢SQL語句,就可以實現SQL查詢的優化,重構的SQL如下所示 select top 頁大小 * from table1 where id<= (select min (id) from (select top ((頁碼-1)*頁大小) id from table1 order by id desc) as T ) order by id desc 下面的JSP演示代碼中,intPageSize為頁大小,intPage為頁碼,id為主鍵,演示了操作一個t_Proct表,並加入各類查詢條件之後的重構SQL的主要語句,經過實際調試,經過這樣簡單優化後的SQL查詢速度遠遠高於優化前的查詢速度。 String sql=" from t_Proct where 1=1 and "; String ProctName = request.getParameter("ProctName"); if (ProctName!=null) sql=sql+"ProctName like '%" + ProctName + "%' and " ; sql=sql.substring(0,sql.length()-4); // 去掉尾部的 and 字元串 sql="select top " + String.valueOf(intPageSize) + " *" +sql+" and id <=(select min(id) from (select top " + String.valueOf(intPage*intPageSize) + " id " + sql + " order by id desc) as T) "; //通過子查詢加快速度 sql=sql+" order by id desc "; 轉載地址: http://www.williamlong.info/archives/1795.html

Ⅳ (問題解決再追加100分)sql server存儲過程實現查詢數據條數過大,分頁查詢怎麼實現

按說5-8w這樣數量級的數據沒有問題,寫入Excel是布比較耗性能,主要還是要通過優化寫入Excel的代碼效率上去考慮。你可以考慮利用分批查詢寫入的方式來避免一次寫太多的數據到Excel:將你的查詢結果分段,比方你的語句中能不能用時間來認為分段,每次返回部分結果。
回到你的問題,對大數據量查詢的解決方案有以下兩種:
(1)、將全部數據先查詢到內存中,然後在內存中進行分頁,這種方式對內存佔用較大,必須限制一次查詢的數據量。
(2)、採用存儲過程在資料庫中進行分頁,這種方式對資料庫的依賴較大,不同的資料庫實現機制不通,並且查詢效率不夠理想。以上兩種方式對用戶來說都不夠友好。

2.解決思路
通過在待查詢的資料庫表上增加一個用於查詢的自增長欄位,然後採用該欄位進行分頁查詢,可以很好地解決這個問題。下面舉例說明這種分頁查詢方案。

(1)、在待查詢的表格上增加一個long型的自增長列,取名為「queryId」,mssql、sybase直接支持自增長欄位,oracle可以用sequence和trigger來實現。然後在該列上加上一個索引。
添加queryId列的語句如下:
Mssql: [QUERYID] [bigint] IDENTITY (1, 1)

Sybase: QUERYID numeric(19) identity

Oracle:
CREATE SEQUENCE queryId_S
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999 MINVALUE 1
CYCLE
CACHE 20
ORDER;
CREATE OR REPLACE TRIGGER queryId_T BEFORE INSERT
ON "test_table"
FOR EACH ROW
BEGIN
select queryId_S.nextval into :new.queryId from al;
END;

(2)、在查詢第一頁時,先按照大小順序的倒序查出所有的queryId,
語句如下:select queryId from test_table where + 查詢條件 +order by queryId desc 。
因為只是查詢queryId欄位,即使表格中的數據量很大,該查詢也會很快得到結果。然後將得到的queryId保存在應用伺服器的一個數組中。

(3)、用戶在客戶端進行翻頁操作時,客戶端將待查詢的頁號作為參數傳遞給應用伺服器,伺服器通過頁號和queyId數組算出待查詢的queyId最大和最小值,然後進行查詢。

算出queyId最大和最小值的演算法如下,其中page為待查詢的頁號,pageSize為每頁的大小,queryIds為第二步生成的queryId數組:
int startRow = (page - 1) * pageSize
int endRow = page * pageSize - 1;
if (endRow >=queryIds.length)
{
endRow = this.queryIds.length - 1;
}
long startId =queryIds[startRow];
long endId =queryIds[endRow];

查詢語句如下:
String sql = "select * from test_table" + 查詢條件 + "(queryId <= " + startId + " and queryId >= " + endId + ")";

3.效果評價
該分頁查詢方法對所有資料庫都適用,對應用伺服器、資料庫伺服器、查詢客戶端的cpu和內存佔用都較低,查詢速度較快,是一個較為理想的分頁查詢實現方案。經過測試,查詢4百萬條數據,可以在3分鍾內顯示出首頁數據,以後每一次翻頁操作基本在2秒以內。內存和cpu佔用無明顯增長。

以上也僅僅是分頁查詢結果查看的問題,你需要寫入到Excel的話還需要考慮Excel寫入代碼的執行效率,這部分是很值得研究的。

Ⅳ 關於Java的分頁演算法,急!

使用分頁類,直接調用就可以,代碼如下:

package com.godwin.news.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;

/**
* 分頁類,用於封閉分頁顯示信息
*
* @author javabs
*
*/
public class Pager {

// 當前頁
private int currentPage;
// 總頁數
private int totalPage;
// 總記錄數
private int totalRecord;
// 每頁條數
private int pageSize;
// 是否有下一頁
private int hasNext;
private ArrayList keys;
private ArrayList values;
// 查詢串
private String queryString;
// 首頁
private String firstLink;
// 上一頁
private String previousLink;
// 下一頁
private String nextLink;
// 尾頁
private String lastLink;
// 鏈接
private String forScriptLink;

public Pager(int pageSize, String queryString) {
keys = new ArrayList();
values = new ArrayList();
setQueryString(queryString);
setPageSize(pageSize);
}

public String getForScriptLink() {
if (keys.contains("toPage"))
removeKey("toPage");
String tmp = getQueryString();
if (tmp.length() == 0)
return "?";
else
return "?" + tmp + "&";
}

public int getCurrentPage() {
return currentPage;
}

public void setCurrentPage(String toPage) {
int tmpage = 1;
try {
tmpage = Integer.parseInt(toPage);
} catch (NumberFormatException e) {
tmpage = 1;
}
if (tmpage < 1)
tmpage = 1;
else if (tmpage > getTotalPage())
tmpage = getTotalPage();
currentPage = tmpage;
}

public String getFirstLink() {
return getQueryStr(1);
}

public int getHasNext() {
int i = 1;
if (getCurrentPage() >= getTotalPage())
i = 0;
return i;
}

public String getLastLink() {
return getQueryStr(getTotalPage());
}

public String getNextLink() {
return getQueryStr(currentPage == totalPage ? currentPage : (currentPage + 1));
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public String getPreviousLink() {
return getQueryStr(currentPage == 1 ? currentPage : currentPage - 1);
}

public void setPreviousLink(String previousLink) {
this.previousLink = previousLink;
}

public String getQueryString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
String key = (String) keys.get(i);
String value = (String) values.get(i);
sb.append("&");
sb.append(key);
sb.append("=");
sb.append(value);
}

return sb.delete(0, 1).toString();
}

public void setQueryString(String queryString) {
if (queryString != null) {
String s[] = queryString.split("&");
for (int i = 0; i < s.length; i++) {
String s1[] = s[i].split("=");
if (s1.length == 2) {
keys.add(s1[0]);
values.add(s1[1]);
} else {
keys.add(s1[0]);
values.add("");
}
}

}
}

public int getTotalPage() {
return totalPage;
}

public void setTotalPage() {
if (totalRecord % pageSize == 0) {
totalPage = totalRecord / pageSize;
totalPage = totalPage == 0 ? 1 : totalPage;
}
else
totalPage = totalRecord / pageSize + 1;
}

public int getTotalRecord() {
return totalRecord;
}

public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
setTotalPage();
}

public String[] getQueryParameterValues(String key) {
return getQueryParameterValues(key, "UTF-8");
}

public String[] getQueryParameterValues(String key, String decode) {
ArrayList ret = new ArrayList();
for (int i = 0; i < keys.size(); i++)
if (((String) keys.get(i)).equals(key))
try {
ret.add(URLDecoder.decode((String) values.get(i), decode));
} catch (UnsupportedEncodingException e) {
ret.add((String) values.get(i));
}

if (ret.size() == 0)
return null;
String strArr[] = new String[ret.size()];
for (int i = 0; i < ret.size(); i++)
strArr[i] = (String) ret.get(i);

return strArr;
}

public String getQueryParameter(String key) {
return getQueryParameter(key, "UTF-8");
}

public String getQueryParameter(String key, String decode) {
String value = "";
if (key != "toPage") {
try {
value = URLDecoder.decode(getValue(key), decode);
} catch (UnsupportedEncodingException e) {
value = getValue(key);
}
} else {
int tmpage = 1;
try {
value = getValue(key);
tmpage = Integer.parseInt(value);
} catch (NumberFormatException e) {
tmpage = 1;
} catch (NullPointerException e1) {
tmpage = 1;
}
if (tmpage < 1)
tmpage = 1;
else if (tmpage > getTotalPage())
tmpage = getTotalPage();
value = (new StringBuffer(String.valueOf(tmpage))).toString();
}
return value;
}

public void setQueryParameter(String key, String value) {
if (key.equals("toPage"))
removeKey(key);
keys.add(key);
values.add(value);
}

public String getQueryStr(int toPage) {
setQueryParameter("toPage", (new StringBuffer(String.valueOf(toPage))).toString());
return "?" + getQueryString();
}

private String getValue(String key) {
String ret = "";
for (int i = 0; i < keys.size(); i++) {
if (!((String) keys.get(i)).equals(key))
continue;
ret = (String) values.get(i);
break;
}

return ret;
}

private void removeKey(String key) {
for (int i = 0; i < keys.size(); i++) {
if (!((String) keys.get(i)).equals(key))
continue;
keys.remove(i);
values.remove(i);
break;
}

}

public static void main(String args[]) {
String str = "a=中文aa&b=2&c=3&c=4&c=5";
Pager page = new Pager(2, str);
page.setTotalRecord(10);
page.setCurrentPage("1");
System.out.println(page.getFirstLink());
System.out.println(page.getPreviousLink());
System.out.println(page.getNextLink());
System.out.println(page.getLastLink());
String s = page.getQueryParameter("a");
System.out.println("s: " + s);
}
}

Ⅵ 關於oracle資料庫的問題,幫我看下這兩個分頁演算法的語句有什麼問題....

很明顯啊,第一條 where rn<=3這個條件就限制了智能查前三條(行號小於3),第二條where rn>=1;(含號大於1),另外提一點語句寫的太繁瑣了,要那麼多嵌套干什麼呢,
(1)查前三條:select temp1.*, rn from (select * from goodsinfo where goodstype='香港電影' order by goodsid) temp1 where rn>=1
(2)查二至5條:select temp1.*, rn from (select * from goodsinfo where goodstype='香港電影' order by goodsid) temp1 where rn>=2 and rn<=5

Ⅶ 求解 一個分頁的計算公式

page = (row-1)/5+1
即,頁數=(行數-1)/5+1
注,「/」整數相除,得到的結果還是整數(如,4/5=0)。
則:
第1行,頁數=(1-1)/5+1=1
第2行,頁數=(2-1)/5+1=1
第3行,頁數=(3-1)/5+1=1
第4行,頁數=(4-1)/5+1=1
第5行,頁數=(5-1)/5+1=1
第6行,頁數=(6-1)/5+1=2
第7行,頁數=(7-1)/5+1=2
第8行,頁數=(8-1)/5+1=2
第9行,頁數=(9-1)/5+1=2
第10行,頁數=(10-1)/5+1=2
第11行,頁數=(11-1)/5+1=3
……

Ⅷ C# 寫個獲取資料庫 分頁數據的方法 指教

第一種好,GridView的分頁還是要從資料庫中選擇所有記錄然後才分頁,第二種只要分頁的代碼合理怎麼說也強過自帶的GridView,同時你用Page類型,增加可讀性,方便各層分離.
分頁普遍演算法是用TOP先選pagesize*pageindex,然後根據有序主鍵多次用TOP,直至選出pagesize條記錄並返回.
論壇的頁面顯示的話建議用REPEATER,沒有必要用到gridview,因為其附帶的其他功能會增加開銷,論壇的列表頁又沒用到修刪功能.同時最好關閉viewstat,如果不要的話.這個比你去修改分頁方法更能有效方便節省開銷.

Ⅸ java 數據來自不同的庫怎麼分頁

方法很多,可以將數據同步到同一個庫下進行多表查詢,也可以將多庫查詢出來的時候全部查出來,在代碼中寫一個演算法進行分頁,當然這種分頁效率會很低,

Ⅹ 什麼叫程序集分頁和資料庫分頁

PoorPageList專用於WEB站點的首頁列表,內設有數據源緩存機制,使你的大流量首頁得到快速響應。QuicklyPageList控制項,故名思意,最快速的分頁演算法控制項,但缺點是只支持PrimaryKey的排序,如果你的分頁要用到多欄位排序,請用RichPageList控制項,它支持任意欄位的排序,但速度慢於QuicklyPageList。為了說明其使用的簡易性,我們先睹為快:this.PoorPageList1.Connection = SqlConnection 對象或 OledbConnection對象;this.PoorPageList1.SqlSelect = "Proc