问题是这样
我使用存储过程+游标进行分页,从代码上看感觉效率应该不是很好。请大家帮忙分析,给我些意见!主要代码如下:
create or replace procedure SC_ADMIN_LIST(v_allcount out integer,v_rc1 out globalpkg.rct1) isbegin select count(*) into v_allcount from a_admin;--求总记录数 --游标使用 open v_rc1 for select * from a_admin order by ad_id desc; commit; exception when others then rollback; raise; end SC_ADMIN_LIST;
这个存储过程很简单,就是返回总的记录数,和游标v_rc1,它的作用就是映射查询记录(不知道这样说对不对,望指正!)下面是PHP调用情况:
当然,首先是创建游标$rc,然后执行存储过程SC_ADMIN_LIST
再是执行游标oci_execute,然后获取结果集,代码如下
oci_fetch_all($rc,$_tmp,$offset,$limit,OCI_FETCHSTATEMENT_BY_ROW+OCI_ASSOC);
解释下,$rc,是一个新建的游标,传入存储过程
$_tmp指返回的结果集
$offset是指从第$offset行开始
$limit,指获取行数
我的疑问在于,每次调用存储过程的时候,是不是都要执行
select * from a_admin order by ad_id desc;
就是查询出所有的符合条件的记录,然后通过游标来取其中的数据子集?如果是这样的话,效率是不是太低了?如果不是,那又是怎么样的执行情况?
我使用存储过程+游标进行分页,从代码上看感觉效率应该不是很好。请大家帮忙分析,给我些意见!主要代码如下:
create or replace procedure SC_ADMIN_LIST(v_allcount out integer,v_rc1 out globalpkg.rct1) isbegin select count(*) into v_allcount from a_admin;--求总记录数 --游标使用 open v_rc1 for select * from a_admin order by ad_id desc; commit; exception when others then rollback; raise; end SC_ADMIN_LIST;
这个存储过程很简单,就是返回总的记录数,和游标v_rc1,它的作用就是映射查询记录(不知道这样说对不对,望指正!)下面是PHP调用情况:
当然,首先是创建游标$rc,然后执行存储过程SC_ADMIN_LIST
再是执行游标oci_execute,然后获取结果集,代码如下
oci_fetch_all($rc,$_tmp,$offset,$limit,OCI_FETCHSTATEMENT_BY_ROW+OCI_ASSOC);
解释下,$rc,是一个新建的游标,传入存储过程
$_tmp指返回的结果集
$offset是指从第$offset行开始
$limit,指获取行数
我的疑问在于,每次调用存储过程的时候,是不是都要执行
select * from a_admin order by ad_id desc;
就是查询出所有的符合条件的记录,然后通过游标来取其中的数据子集?如果是这样的话,效率是不是太低了?如果不是,那又是怎么样的执行情况?
lz这种方法很少见。lz可以自己做个执行计划对比一下,选择效率高的那个就行了。
与其在这里问别人,不如让oracle输出一下更准确。
查询所有的记录,这效率肯定是高不了.
* get a page data from database
* @param str_type $strquery a table
* @param int $total
* @param int $page pagecode
* @param int $rows rows of data will display in a page
* @return data limit rows
*/
public function dbGetpage($strquery, $total, $page, $rows)
{
$start_row = ($page - 1) * $rows + 1;
$start_row = $start_row > $total ? 1 : $start_row;
$end_row = $start_row + $rows - 1;
$end_row = $end_row > $total ? $total : $end_row;
$query = "SELECT * FROM ( SELECT ROWNUM as row_num, r.* FROM ( $strquery ) r WHERE ROWNUM <= $end_row ) WHERE $start_row <= row_num";
return $this->dbGetall($query);
}
供参考