0

製品分類を含むテーブルと結合された在庫データを含むテーブルを更新しようとすると、大きな問題に直面しています。この操作の実行には時間がかかります。

テーブル dw_giacenze (flag_nomatch パラメータが T に等しい) a は、ecat_key フィールドで dw_key_prod z との内部結合に配置されます。a には最大 300 万件のレコードが含まれ、z には 15 万件のレコードが含まれます。実行に2時間以上かかります。

私が使用している更新クエリの下。

update dw_giacenze 
set cate_ecat_key = z.cate_ecat_key,
        sottocat_ecat_key = z.sottocat_ecat_key,
    marchio_key = z.marchio_key,
    sottocat_bi_key = z.sottocat_bi_key,
    gruppo_bi_key = z.gruppo_bi_key,
    famiglia_bi_key = z.famiglia_bi_key,
    flag_nomatch = NULL
from dw_giacenze a
    inner join dw_key_prod z on
        z.ecat_key = a.ecat_key
where
    a.flag_nomatch = 'T';

誰かがそれを最適化するのを手伝ってくれますか? 前もって感謝します!

エンリコ

4

1 に答える 1

0

a.flag_nomatch = 'T' に注目することをお勧めします。

何が起こっているのかを明確に把握するには、SQL Server プロファイラーを使用するのが最適な方法です。これが、読み取りがテーブル内の行数と等しいことを示している場合、それは間違いなく問題です。flag_nomatch にインデックスを追加します。

または、これを分離して個別に更新することもできます(最初に)

UPDATE dw_giacenze 
    set sottocat_ecat_key = (SELECT sottocat_ecat_key 
                             FROM dw_key_prod 
                             WHERE dw_key_prod.ecat_key = dw_giacenze.ecat_key)
where
    dw_giacenze.flag_nomatch = 'T';

set ステートメントの最初のパラメーターは、実際には結合の同じパラメーターであることに気付きました。つまり、まったく同じ値に設定しているので、とにかくそれを削除できるはずです。

于 2012-07-06T16:14:54.920 に答える