关于php+oracle存储过程(使用游标)分页的效率问题

duanjianbo26 2009-06-08 10:17:53
问题是这样
我使用存储过程+游标进行分页,从代码上看感觉效率应该不是很好。请大家帮忙分析,给我些意见!主要代码如下:
create or replace procedure SC_ADMIN_LIST

(v_allcount out integer,

v_rc1 out globalpkg.rct1

) is

begin

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;
就是查询出所有的符合条件的记录,然后通过游标来取其中的数据子集?如果是这样的话,效率是不是太低了?如果不是,那又是怎么样的执行情况?

...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
duanjianbo26 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jakey9826 的回复:]
select * from a_admin order by ad_id desc;
查询所有的记录,这效率肯定是高不了.



[/Quote]
我比较同意这样的观点。但这样的分页用了很久了。。。
程序猿之殇 2009-06-08
  • 打赏
  • 举报
回复
select * from a_admin order by ad_id desc;
查询所有的记录,这效率肯定是高不了.


海诗美妆 2009-06-08
  • 打赏
  • 举报
回复
oracle分页,通常使用框架下自带的分野功能,或者是子查询。
lz这种方法很少见。

lz可以自己做个执行计划对比一下,选择效率高的那个就行了。
与其在这里问别人,不如让oracle输出一下更准确。
sunshinexrain 2009-06-08
  • 打赏
  • 举报
回复
SELECT * FROM ( SELECT ROWNUM as row_num, r.* FROM ( $strquery ) r WHERE ROWNUM <= $end_row ) WHERE $start_row <= row_num

/**
* 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);
}


供参考

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧