我有一个下面的插入查询:
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的新手。基于我发现的建议,可以有两种方法来优化它:
创建Indexes
,其中我不知道要索引哪些列以及我应该创建哪种索引。
使用Bulk Processing with BULK COLLECT and FORALL
。
我不知道上述解决方案是否正确。有人可以就此提出建议吗?如果还有其他方法可以改善性能,请告诉我。
答案 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;