0

我有一个源表和一个相同的目标表,其中我们有一个每天、每个客户、每个周期的费率,我们每天有 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

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

下面是我的查询,它工作正常,但我的问题是源表和目标表中都有超过 400 万行,所以这个过程花费的时间太长,我们在 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

谢谢

4

2 回答 2

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
        )
;
于 2013-06-07T15:42:48.360 回答
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;

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

于 2013-06-18T05:24:59.223 回答