0

フィールドDATASOURCE、PEOPLEID、TOTVALUE(〜600万レコード)を持つテーブルtotalsと、フィールドPEOPLEIDとVALUE(約300万レコード)を持つテーブルsource1があります。合計で、DATASOURCE ごとに一意の peopleid がありますが、 source1には、各 peopleid に対して複数のレコードがあります。source1 のすべての peopleidすでに totals に含まれていますが、その値には含まれていません。

「テスト」小さなテーブルでsource1から取得した合計のフィールドTOTVALUEを更新する更新クエリを取得することができましたが、今ではそれを実際のテーブルで実行しようとしているので、それは永遠に実行されています...そして私はsource2source3などに対して繰り返す必要があります...

私が実行するクエリは次のとおりです。

UPDATE  totals t
    INNER JOIN 
    (
        SELECT  peopleid,
                sum(value) AS TotValues
        FROM source1
        GROUP BY peopleid
    ) s
    ON t.peopleid = s.peopleid
SET t.totvalue = s.TotValues
where
t.datasource like 'source1'

このクエリを実行して最適化するためのより良い方法があると思いますか?

4

2 に答える 2

1
  • since=の代わりに使用すると思いますが、パターンを検索していませんよね?LIKE
  • 両方のテーブルINDEXに on 列を作成します:およびPeopleIDtotalssource
  • 可能であれば、datasourceテーブルの列にもインデックスを追加しますtotals

クエリ、

UPDATE  totals t
        INNER JOIN 
        (
            SELECT  peopleid,
                    sum(value) AS TotValues
            FROM    source1
            GROUP   BY peopleid
        ) s
        ON t.peopleid = s.peopleid
SET     t.peopleid = s.peopleid
WHERE   t.datasource = 'source1'
于 2013-01-30T09:02:46.833 に答える
0

最初にデータを結合してみてください。両方のテーブルで peopleid 列のインデックスを作成することを忘れないでください。

UPDATE  totals t
    INNER JOIN 
    (
        select * from (
          SELECT  t.datasource,
                  peopleid,
                  sum(value) AS TotValues
          FROM source1 s INNER JOIN 
               totals t
                      ON t.peopleid = s.peopleid
          GROUP BY t.datasource, t.peopleid
        ) s_aux
    ) s
    ON t.peopleid = s.peopleid and t.datasource = s.datasource
SET t.totvalue = s.TotValues
于 2013-01-30T09:03:23.603 に答える