嗨,我需要优化以下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万行
您对如何改善查询有任何想法吗?
答案 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'
新创建的索引中列的顺序对于查询性能而言可能非常重要,并且很大程度上取决于这些选择性。