Oracle存储过程优化

雨山 发布于 2012/02/29 14:05
阅读 2K+
收藏 1
create or replace procedure PROC_LFQM_PDF_T(countMonth  varchar2) as
       V_COUNT_WARRANTY_BOOK  NUMBER        ;            --统计份数
       V_COUNT_FLAG      VARCHAR2(10) := '0'        ;    --标识 
begin
    if (countMonth is not null) then
          begin
                SELECT COUNT(*) INTO V_COUNT_WARRANTY_BOOK FROM T_LFQM_PDF_INF_COUNT D WHERE D.Count_Date=countMonth;
                if(V_COUNT_WARRANTY_BOOK>0) then
                       DELETE FROM T_LFQM_PDF_INF_COUNT D WHERE D.Count_Date=countMonth;
                end if;
                insert into bodba.t_lfqm_pdf_inf_count(COUNT_DATE, 
                                                    COUNT_WARRANTY_BOOK,
                                                    COUNT_FLAG,
                                                    COUNT_CREATE_DATE,
                                                    COUNT_SALENETWORK,
                                                    COUNT_SALENETWORKNAME)
               SELECT to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM') ,
                count(distinct t.tc_num_tc),
                V_COUNT_FLAG,
                to_char(sysdate,'YYYY-MM-DD HH24:mi:ss '),
                   a1.sale_network,
                     (select t22.val_desc_cn from bodba.t22 t22 where t22.value_set_code = 'S002'
                AND t22.val = a1.sale_network) 
                FROM bodba.pdf t, bodba.ta4 a4, bodba.ta1 a1
               WHERE t.order_num = a4.order_num and a4.contract_num = a1.contract_num
                AND a4.company_code = a1.company_code group by a1.sale_network,
               to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM')
               having to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM') >=countMonth
               AND to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM') <=countMonth ;
                commit;
               exception
                 when others then
                 rollback;
           end;
     end if;
end PROC_PDF_TEST;

新学写存储过程,因为数据太多了,里面的查询语句会跑近20分钟,同事说有个办法是把里面的

INSERT INTO SELECT 给拆开,别一次查出来,我瞅了半天,实在不知道该怎么给拆开查询,哪位大大教教我.

加载中
0
徐小路
徐小路

做成游标,然后插入,提交时分批提交避免大事务。

徐小路
徐小路
@雨山 : 例外条件字段最好不要加函数。可以考虑将参数值改成符合条件字段的格式去判断。
徐小路
徐小路
@雨山 : 如果只有几十条数据,那么就是你这个select语句写的有问题了,仔细分析下条件字段或者group by的字段是否有索引,条件判断的是否有问题。多分析分析。可以看下sql的解释计划。
雨山
雨山
它查出来的数据也就那么几十条,可是要查的表里面的数据太多了 所以新增的话应该很快,就是这个查询不知道该怎么优化了..
0
徐小路
徐小路
例外尽量优化select语句
0
徐小路
徐小路
to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM') >= countMonth
  AND to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM') <= countMonth;  这样写的作用是啥?
徐小路
徐小路
@雨山 : 我看这个条件就等价于to_char(to_date(t.in_date, 'yyyy/MM/dd hh24:mi:ss'), 'yyyyMM') = countMonth
雨山
雨山
嗯? 根据传进来的参数 某年月 查询
0
雨山
雨山

最后是吧having 改成了 and 就快了很多   还有把group by 置后了

返回顶部
顶部