当前位置:首页 » 数据仓库 » 数据库分页算法
扩展阅读
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