1

您好我需要优化下面的 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 分钟插入约 100k 行

解释计划: 在此处输入图像描述

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

4

1 回答 1

0

根据您显示的执行计划,瓶颈在SELECT语句中。您没有回答选择的选择性,所以我假设它低于 5%,因此,您应该使用索引。

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

create index ix1 on exa_table2 (STATUS, ACTIVE, DATE, SDATE, ID);

如果选择性低,该指标将提高性能。先在没有任何并行性的情况下尝试它,看看它的性能如何。一旦你发现它表现良好,你就可以投入更多的硬件。

此外,了解以下每个过滤条件的单个(单独)选择性也非常重要:

  • STATUS = '1'
  • ACTIVE = '1'
  • DATE >= '20180924'
  • SDATE < '20181024'

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

于 2019-01-08T21:02:23.150 回答