各位老大帮个忙,我下面这个语句数据量比较大
insert into srbz_qf_t(acct_month,SERV_ID,ACCT_ID,qf_acct_month,QF_CHARGE,
acc_nbr,cust_id,cust_type_id,product_id,product_offer_id,
product_offer_instance_id,region_id,payment_mode,billing_type_id,
payment_method_name,is_reduser_flag,state,serv_state)
select '200903' acct_month,a.SERV_ID,a.ACCT_ID,a.ACCT_MONTH qf_acct_month,a.QF_CHARGE,
b.acc_nbr,b.cust_id,b.cust_type_id,b.product_id,b.product_offer_id,
b.product_offer_instance_id,b.region_id,b.payment_mode,b.billing_type_id,
b.payment_method_name,b.is_reduser_flag,b.state,b.serv_state
from srbz_acct_item_200904_t a,srbz.srbz_serv_t b
where a.serv_id = b.serv_id(+);
commit;
表srbz_acct_item_200904_t和 srbz.srbz_serv_t大约都有200多万,索引已经创建
表srbz_qf_t原来有数据大约1000多万,我咋样才能提高语句执行的速度呢

解决方案 »

  1.   

    对于大数据量的查询插入,编一个procedures,在procedures中有游标,这样可以极大提高性能。
      

  2.   

    你的sql语句select部分看来是没什么好优化的了。肯定是先对一个表full scan,
    然后再对另一个表index range scan,再连接获得结果。
    需要在插入方面下点功夫:
    1。分批插入,你原来的sql运行会占用大量的回滚空间,改为一次插入1000,再commit,再插入1000,...
    2。去掉srbz_qf_t表上的索引,插入后再重建索引
    3。暂时不用归档模式
    当然,你也可以采用sql loader等工具批量导入
      

  3.   

    用CTAS后再insert /*+ append */ into结合分批commit到srbz_qf_t表。直接insert分批COMMIT的话,也要借助临时表,且速度不如 ctas,所以不如用上面的方法试试看。
      

  4.   

    select '200903' acct_month,a.SERV_ID,a.ACCT_ID,a.ACCT_MONTH qf_acct_month,a.QF_CHARGE, 
    b.acc_nbr,b.cust_id,b.cust_type_id,b.product_id,b.product_offer_id, 
    b.product_offer_instance_id,b.region_id,b.payment_mode,b.billing_type_id, 
    b.payment_method_name,b.is_reduser_flag,b.state,b.serv_state 
    from srbz_acct_item_200904_t a,srbz.srbz_serv_t b 
    where a.serv_id = b.serv_id(+); 首先这个速度如何?返回多少数据?
    这表应该是电信计费系统的?
      

  5.   

    实际就是使用批量绑定的形式来插入,但不管怎么样,你的select 语句我估计速度也不怎么样.能帖一下执行计划吗?explain plan for selec ....
    select * from table(dbms_xplan.display);