如何优化insert into..select Query?

时间:2015-07-13 06:41:03

标签: oracle optimization sql-insert

我有一个下面的插入查询:

Insert into MAP_REL_ATTRIBUTE_PHYID
    (MAP_RELNAME, MAP_ATTRNAME,MAP_ATTRVALUE,Source_PHYID,MAP_REL_PHYID) 
Select  a.map_relname,a.MAP_ATTRNAME,a.MAP_ATTRVALUE,a.id,b.ID 
from key_attribute a ,
           target_attribute b,
           map_rel_phyid c 
 where  a.id = c.Source_phyid 
 and b.id=c.map_rel_phyid 
 and  a.map_relname = 'Connected By' 
 and  a.map_attrname= b.attr_name  
 and  dbms_lob.compare(a.MAP_ATTRVALUE,b.ATTR_VALUE)=0  

有关DDL和样本数据,请参阅:Check here

此选择查询返回大约2000万条记录,因此无限时间将数据插入表中。我正在尝试优化此查询。我是oracle的新手。基于我发现的建议,可以有两种方法来优化它:

  1. 创建Indexes,其中我不知道要索引哪些列以及我应该创建哪种索引。

  2. 使用Bulk Processing with BULK COLLECT and FORALL

  3. 我不知道上述解决方案是否正确。有人可以就此提出建议吗?如果还有其他方法可以改善性能,请告诉我。

1 个答案:

答案 0 :(得分:0)

1)使用附加提示进行插入

2)如果从表中选择所有行,请不要使用任何索引

3)使用并行提示进行插入和选择(确保首先启用并行DML)

alter session enable parallel dml;

Insert /*+ APPEND PARALLEL(4) */ into MAP_REL_ATTRIBUTE_PHYID
    (MAP_RELNAME, MAP_ATTRNAME,MAP_ATTRVALUE,Source_PHYID,MAP_REL_PHYID) 
Select /*+ PARALLEL(4) USE_HASH(a b c) */ a.map_relname,a.MAP_ATTRNAME,a.MAP_ATTRVALUE,a.id,b.ID 
from key_attribute a ,
           target_attribute b,
           map_rel_phyid c 
 where  a.id = c.Source_phyid 
 and b.id=c.map_rel_phyid 
 and  a.map_relname = 'Connected By' 
 and  a.map_attrname= b.attr_name  
 and  dbms_lob.compare(a.MAP_ATTRVALUE,b.ATTR_VALUE)=0;