海量数据查询快速估计总数方法

估算大概值可以分析执行计划信息
sql:
EXPLAIN PLAN FOR
select *
from xx t where 1=1
and date1 >= to_date('2011-12-09 00:00:15','yyyy-MM-dd hh24:mi:ss')
and date2 <= to_date('2011-12-19 00:00:40','yyyy-MM-dd hh24:mi:ss');

select * from table(DBMS_XPLAN.DISPLAY);


***********************************************************************

java方法:

/**
*
* 快速估算大约总记录数
* @param 查询sql
* @return 大约总数记录数
*/
public int getComputeTotal(String sql) {
Statement st = null;
ResultSet reset = null;
int computeTotal=0;
try {
String sqlexplan = "EXPLAIN PLAN FOR "+sql;
Connection newconnect = getConnection(true);
st = newconnect.createStatement();
st.execute(sqlexplan);
st = newconnect.createStatement();
reset = st.executeQuery("select t.plan_table_output from table(DBMS_XPLAN.DISPLAY) t");
String rowString="";
int i=0;
while (reset.next()) {
if(i==5){
rowString=reset.getString("plan_table_output");
break;
}
i++;
}
if(rowString!=null&&!"".equals(rowString)){
rowString=rowString.replaceAll(" ", "");
String rows[]=rowString.split("\\|");
if(rows[4].endsWith("K")){
rows[4]=rows[4].substring(0, rows[4].length()-1);
computeTotal=Integer.valueOf(rows[4])*1000;
}else if(rows[4].endsWith("M")){
rows[4]=rows[4].substring(0, rows[4].length()-1);
computeTotal=Integer.valueOf(rows[4])*1000*1000;
}else if(rows[4].endsWith("T")){
rows[4]=rows[4].substring(0, rows[4].length()-1);
computeTotal=Integer.valueOf(rows[4])*1000*1000*1000;
}else{
computeTotal=Integer.valueOf(rows[4]);
}
}
reset.close();
} catch (Exception e) {
logger.error(e);
} finally {
this.close(this.connect, st, reset);
}
return computeTotal;
}
*******************************************************
分页处需要修改:

int computeTotal=getComputeTotal(sqlall);
if(computeTotal<100000){
String countsql = "select count(*) from xx t where 1=1 "+sqllike+"";
int count = 0;
st = getConnection().createStatement();
reset = st.executeQuery(countsql);
while(reset.next()){
count = reset.getInt(1);
}
pager.setTotal(count);
pager.setPageTotal(count/pager.getPageSize());
}else{
pager.setTotal(computeTotal);
pager.setPageTotal(computeTotal/pager.getPageSize());
}

已经在3亿数据量数据库做过测试

附快速统计某个表总记录数sql:
select table_name,num_rows from dba_tables where table_name ='XX'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值