财务系统的中间表里gl_tabl里实现已经创建了索引,最后也是统一commit的。
--省略部分逻辑SQL(提取本地数据到本地的gl_table中)----
INSERT INTO gl_table@DBL_XZD(id,tf_sign,tr_date,tr_type,tr_num)
select id,tf_sign,tr_date,tr_type,tr_num from  gl_table where tr_date = to_date(v_biz_date, 'yyyymmdd');
commit;其中v_biz_date是包要传的参数。
我换成 execute immediate ’INTO gl_table@DBL_XZD(id,tf_sign,tr_date,tr_type,tr_num)
select id,tf_sign,tr_date,tr_type,tr_num from  gl_table where tr_date = :biz_date' using to_date(v_biz_date, 'yyyymmdd');
commit;
还是很慢,有的时候失败。

解决方案 »

  1.   

    既然是每天都更新数据,你何不用job 执行 每天的业务数据,何必去前台操作呢
      

  2.   

    这个看具体你操作的数据集大小了。
    另外gl.tr_date 是一定要建立索引的。。
      

  3.   

    tr_date这个字段一定要创建索引的吗?财务系统和本地系统中的gl_table中的tr_date要创建索引,是吗?不能是其他的字段,是吗?
      

  4.   

    你可以看看下面sql的执行计划,如果没有使用其他索引过滤的话,建议你按照我说的创建索引测试一下效率。
    select id,tf_sign,tr_date,tr_type,tr_num from  gl_table where tr_date = to_date(v_biz_date, 'yyyymmdd');
      

  5.   

    查询的是本地的数据,在本地系统中的gl_table中的tr_date创建索引即可。
    财务系统中建立索引过多的话,也会影响插入的效率。
      

  6.   

    以前类似的功能我们是采用 materialized view做的,效率还可以,因为是增量的。
      

  7.   

    oracle 的执行计划怎么看啊?不会操作啊?
      

  8.   

    PL/SQL DEVELOPER里面直接按F5,或者命令行set autotrace on