0

ソース テーブルと同一のターゲット テーブルがあります。それらには、1 日あたり、顧客ごと、期間ごとのレートがあり、1 日あたり 48 の期間があるため、1 人の顧客の場合、1 日あたり 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

2 つのテーブルを比較し、ソース テーブルには存在するがターゲット テーブルには存在しない行をターゲット テーブルに挿入するスクリプトを作成しています。

以下は正常に動作するクエリですが、問題は、ソース テーブルとターゲット テーブルの両方に 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 に答える