在具有大量行的表上优化Oracle连接查询

时间:2013-06-07 15:19:03

标签: sql oracle plsql oracle10g

我有一个源表和一个相同的目标表,其中我们有每个客户每天的费率,我们有48个时期 对于每一天,我们每天有48行。

tblSource
SD          UpdateDate            CustId  Period   Rate
01/01/2013  01/01/2013 14:30:29    1245    1       2.3 
01/01/2013  01/01/2013 14:32:29    1245    2       4.3 
01/01/2013  01/01/2013 14:34:29    1245    3       2.1 
.....
01/01/2013  01/01/2013 14:34:29    1245    48       2.1 

tblTarget
SD          UpdateDate            CustId  Period   Rate
01/01/2013  01/01/2013 14:30:29    1245    1       2.3 
01/01/2013  01/01/2013 14:32:29    1245    2       4.3 
01/01/2013  01/01/2013 14:34:29    1245    3       2.1 
.....
01/01/2013  01/01/2013 14:34:29    1245    48       2.1

我正在编写一个脚本,它将比较两个表并将源表上存在但不存在于目标表中的任何行插入到目标表中。

以下是我的查询工作正常,但我的问题是源表和目标表都有超过4百万行因此进程耗时太长,我们在目标上有索引SD,CustId和Period列上的源表和源表。

是否有任何其他方式来编写此查询或对其进行优化,以便我们提高速度。

SELECT s.SD, s.UpdateDate, s.CustId, s.Period, s.Rate 
FROM tblScource s
LEFT JOIN tblTarget t ON t.sd = s.SD AND s.CustId = t.CustId AND s.Period = t.Rate 
WHERE t.SD IS NULL and t.custId IS NULL

由于

2 个答案:

答案 0 :(得分:0)

SELECT  s.SD, s.UpdateDate, s.CustId, s.Period, s.Rate 
FROM    tblScource s
WHERE   NOT EXISTS
        (
            SELECT  1
            FROM    tblTarget t
            WHERE   t.sd = s.SD
            AND     s.CustId = t.CustId
            AND     s.Period = t.Rate
            AND     t.SD IS NULL
            AND     t.custId IS NULL
        )
;

答案 1 :(得分:0)

你能告诉我们解释计划吗? 尝试将表创建为select,以便查看SELECT进程消耗的时间,

create table as SELECT s.SD, s.UpdateDate, s.CustId, s.Period, s.Rate 
FROM tblScource s
LEFT JOIN tblTarget t ON t.sd = s.SD AND s.CustId = t.CustId AND s.Period = t.Rate 
WHERE t.SD IS NULL and t.custId IS NULL;

如果问题可能在目标表上没有花费太多时间,请尝试在合并之前删除目标表上的索引,然后再重新创建它。