优化插入选择查询Oracle

时间:2019-01-08 16:24:19

标签: sql oracle performance query-optimization insert-select

嗨,我需要优化以下sql查询。

insert into exa_table (column1, column2, column3, column4)
select value1, value2, value3, value4 from 
(select tb2.ID, tb2.PARCELNO, tb2.SHP_ID, tb4.CUST_ID
from exa_table2 tb2 
join table3 tb3 on tb2.ID = tb3.ID 
join table4 tb4 on tb3.ID = tb4.ID 
where tb2.STATUS='1' and tb2.ACTIVE='1' and tb2.DATE >= '20180924' AND tb2.SDATE < '20181024' and 
tb4.STATUS='1' and tb4.ACTIVE='1' and 
not exists (select 1 from exa_table Q where Q.ID = tb2.ID));

我已经尝试通过添加APPEND NOLOGGING和PARALLEL来优化查询,例如

insert /*+ APPEND NOLOGGING */ into exa_table (column1, column2, column3, column4)
select value1, value2, value3, value4 from 
(select /*+ PARALLEL(4) */ tb2.ID, tb2.PARCELNO, tb2.SHP_ID, tb4.CUST_ID
from exa_table2 tb2 
join table3 tb3 on tb2.ID = tb3.ID 
join table4 tb4 on tb3.ID = tb4.ID 
where tb2.STATUS='1' and tb2.ACTIVE='1' and tb2.DATE >= '20180924' AND tb2.SDATE < '20181024' and 
tb4.STATUS='1' and tb4.ACTIVE='1' and 
not exists (select 1 from exa_table Q where Q.ID = tb2.ID));

现在好多了,但仍然不够用-花了13分钟时间插入了约10万行

说明计划: enter image description here

您对如何改善查询有任何想法吗?

1 个答案:

答案 0 :(得分:0)

基于执行计划,您正在sudo docker <container> restart 语句中显示瓶颈。您没有回答选择的选择性,因此我假设它的选择性低于5%,因此,您应该使用索引。

我将从创建以下索引开始:

SELECT

如果选择性低,则该指数将改善性能。在没有任何并行性的情况下先尝试一下,看看它的性能如何。一旦发现其性能良好,就可以为其添加更多硬件。

此外,对于以下每种过滤条件,找出单独的(选择性的)选择性将非常重要:

  • create index ix1 on exa_table2 (STATUS, ACTIVE, DATE, SDATE, ID);
  • STATUS = '1'
  • ACTIVE = '1'
  • DATE >= '20180924'

新创建的索引中列的顺序对于查询性能而言可能非常重要,并且很大程度上取决于这些选择性。