问题是这样
我使用存储过程+游标进行分页,从代码上看感觉效率应该不是很好。请大家帮忙分析,给我些意见!主要代码如下:
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;
就是查询出所有的符合条件的记录,然后通过游标来取其中的数据子集?如果是这样的话,效率是不是太低了?如果不是,那又是怎么样的执行情况?

解决方案 »

  1.   

    oracle分页,通常使用框架下自带的分野功能,或者是子查询。
    lz这种方法很少见。lz可以自己做个执行计划对比一下,选择效率高的那个就行了。
    与其在这里问别人,不如让oracle输出一下更准确。
      

  2.   

    select * from a_admin order by ad_id desc;
    查询所有的记录,这效率肯定是高不了.
      

  3.   

    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);
                        }
    供参考
      

  4.   

    http://blog.csdn.net/pharaohsprince/archive/2006/04/12/660800.aspx