2016-11-14 1 views
1

テーブル「製品」300,000行と「Imported_Products」4,000行があります。また、私はView_Imported_Productsというビューを持っています。これは "Imported_Products"に基づいて整形式になっています。SQL ServerでUPDATEに長時間かかる

私はUPDATEを実行すると:

UPDATE Products SET DateDeleted = GETDATE() 
WHERE Suppiler = 'Supplier1' AND SKU NOT IN (SELECT SKU FROM View_Imported_Products) 

をそれは私がそれを実行しても、2回目がないの行を更新約1分の時間がかかります。

また、私は、NOTにしないで変更し、Products.SKUとView_Imported_Products.SKU上の非クラスタ化インデックスを追加

UPDATE Products SET DateDeleted = GETDATE() FROM Products P 
WHERE Supplier = 'Supplier1' AND NOT EXISTS (SELECT SKU FROM View_Imported_Products I WHERE P.SKU=I.SKU) 

を存在しますが、それはまだ実行に約16秒かかりました。

私が間違っていること、およびその更新プログラムを改善して速く実行する方法

ありがとうございました。

がView_ImportedProducts FROM

  1. SELECT SKUを更新しましたありがとう - 非常に速く走る、それは、JOINをLEFTを使用するには、午後十二時00分00秒秒
  2. 変更したクエリーを取る代わりに、EXISTSません - あまり役に立たない
  3. SELECT * FROM Products AS P 
    WHERE P.Supplier = 'Supplier1' AND DateDeleted IS NULL 
    AND 
    NOT EXISTS 
    (
        SELECT 
         SKU 
        FROM View_ImportedProducts AS I 
        WHERE P.SKU = I.SKU 
    ) 
    
    実行に時間がかかります
+1

あなたは本当にビューを使用する必要がありますか?あなたは 'Imported_Products'を直接使用できませんか? – Lamak

+2

実行計画はどのように見えますか?更新しようとしているレコードの数はいくつですか?更新しているレコードの値にインデックスがありますか? – Igor

+0

商品表には索引付けされたビューまたは同様のものがありますか? – jabs

答えて

0

使用していない

UPDATE Products SET DateDeleted = GETDATE()  FROM Products P 
Left join View_Imported_Products I On  P.SKU=I.SKU 
Where I.Sku is null 

に参加すると、あなたは行(数万)の多くは、あなたが更新されている場合はp.skuとi.sku

+0

なぜこの結合が速いのですか? SQL Serverでは、 'NOT EXISTS'は通常、LEFT JOIN ... IS NO NULLよりも優れています。 – Lamak

+0

ジョインは従属サブクエリを使用する方が良いでしょう。 – Hadi

+0

'SELECT SKU FROM View_Imported_Products I WHERE P.SKU = I.SKU'はフィルタリングする前にデータをロードしています – Hadi

0

上の非クラスタ化インデックスを作成する必要がありますなぜログに大きなヒットを生み出しています。このような場合は、一度に1000行または10000行を更新してからコミットします。あなたのトランザクションはトランザクションログに与える影響はずっと小さく、より高速に実行されます。

1

"Imported_Products" .SKUフィールドに非クラスタ化インデックスを追加して解決しました。私の間違いは、元のテーブルではなく、 "View_Imported_Products" .SKUに非クラスタ化インデックスを追加したことです。助けてもらって、ありがとう!

関連する問題