分享

oracle千万级数据分页存储过程优化

 桑枯海 2014-09-24

随着数据量的增加,Oracle数据库分页存储过程(使用rownum分页)查询性能越来越差,查询时间也越来越长,于是优化势在必行,结合用户一般使用特点(一般看前几页的较多),于是以此为切入点优化原先的存储过程,在WHERE条件中增加rownum<=pageindex*pageSize,减少首次过滤的数据量,调整后的存储过程如下:

CREATE OR REPLACE PACKAGE DotNet is
  TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集
  PROCEDURE DotNetPagination_New(Pindex in number, --分页索引
                                 Psql   in varchar2, --产生dataset的sql语句
                                 Psize  in number, --页面大小
                                 v_cur  out type_cur --返回当前页数据记录
                                 );
  procedure DotNetPageRecordsCount_New(Psqlcount in varchar2, --产生dataset的sql语句
                                       Prcount   out number --返回记录总数
                                       );
end DotNet_New;
CREATE OR REPLACE PACKAGE BODY DotNet is
  PROCEDURE DotNetPagination(Pindex in number,
                             Psql   in varchar2,
                             Psize  in number,
                             v_cur  out type_cur) AS
    v_sql    VARCHAR2(4000);
    v_count  number;
    v_Plow   number;
    v_Phei   number;
    v_Appsql varchar2(1000);
  Begin
    v_Phei   := Pindex * Psize + Psize;
    v_Plow   := v_Phei - Psize + 1;
    --优化的地方--------------
    v_Appsql := '';
    if (Pindex < 1000) then
      v_Appsql := ' and rownum <= ' || v_Phei;
    end if;   
    v_sql := 'select * from (' || Psql || v_Appsql ||
             ') where rn between ' || v_Plow || ' and ' || v_Phei;
    ----------------------------
    --原方法v_sql := 'select * from (' || Psql ||  ') where rn between ' || v_Plow || ' and ' || v_Phei;
    open v_cur for v_sql;
  End DotNetPagination;
  procedure DotNetPageRecordsCount(Psqlcount in varchar2,
                                   Prcount   out number) as
    v_sql     varchar2(4000);
    v_prcount number;
  begin
    v_sql := 'select count(*) from (' || Psqlcount || ')';
    execute immediate v_sql
      into v_prcount;
    Prcount := v_prcount;
  end DotNetPageRecordsCount;
end DotNet;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多