2017-02-02 6 views
-1

なぜ私のクエリが時間がかかりすぎるのか理解できない場合は、アドバイスを探して最適化してください。 SQL Server実行計画レビュー依頼

enter image description here

update Laserbeak_Main.dbo.ACCOUNT_MPN set 
    DateUpgrade = ord.ConnectedDate 
        FROM [ORDER] ord 
        WHERE ord.AccountNumber = Laserbeak_Main.dbo.ACCOUNT_MPN.AccountNumber 
        AND ord.ordertypeID = '2' 
        AND ord.ConnectedDate IS NOT NULL 
        AND DateUpgrade <> ord.ConnectedDate 

Execution plan as requested on brentozar.com

UPDATE:新しいクエリが、この&のように見えるの提案に続いては、はるかに迅速に動作するようです。しかし、クエリを実行すると、期待どおりに行が設定され、再度実行されると、同じ数の行が更新されます。 selectに変換すると、毎回同じ行が更新されていることが確認されます。 <>節はこれを止めるべきですが、そうではありません。私はそれが照合と関係していると信じていましたが、同じデータベース内のテーブルレベルで異なる照合が可能かどうかを確認することができませんでした。

;WITH cteOrderInfo AS (
SELECT DISTINCT ord.AccountNumber, ord.ConnectedDate 
FROM [ORDER] ord 
WHERE ord.ordertypeID = '2' 
AND ord.ConnectedDate IS NOT NULL 
) 
UPDATE Laserbeak_Main.dbo.ACCOUNT_MPN 
SET Laserbeak_Main.dbo.ACCOUNT_MPN.DateUpgrade = cteOrderInfo.ConnectedDate 
FROM cteOrderInfo 
INNER JOIN Laserbeak_Main.dbo.ACCOUNT_MPN acc 
ON cteOrderInfo.AccountNumber = acc.AccountNumber 
WHERE cteOrderInfo.ConnectedDate <> acc.DateUpgrade 

SELECTを確認する:

;WITH cteOrderInfo AS (
SELECT DISTINCT ord.AccountNumber, ord.ConnectedDate 
FROM [ORDER] ord 
WHERE ord.ordertypeID = '2' 
AND ord.ConnectedDate IS NOT NULL 
) 
SELECT cteOrderInfo.ConnectedDate, acc.DateUpgrade 
FROM cteOrderInfo 
INNER JOIN Laserbeak_Main.dbo.ACCOUNT_MPN acc 
ON cteOrderInfo.AccountNumber = acc.AccountNumber 
WHERE cteOrderInfo.ConnectedDate <> acc.DateUpgrade 

SELECT結果サンプル:

enter image description here

+1

ON acc.AccountNumber = dbo.AccountNumber AND ord.orderTypeID = 2' – Serge

+1

'ORDER'テーブルの' AccountNumber'列は一意ではありませんか?もしそうなら、 'WHERE'節がデータセットを十分に制限しない限り、クエリは' ACCOUNT_MPN'テーブルの各行を複数回更新します。これを避けるには、 'FROM ORDER'の代わりに以下のことができます。 'DISTINCT'キーワードでサブクエリを使用します。 b)。 GROUP BY句でサブクエリを使用する。またはc)。既存の 'WHERE'節に条件を追加してください。 – Serge

+1

実行計画をここに貼り付けてリンクを共有できますか: – TheGameiswar

答えて

0

をセルジュは、我々は一意の行を持っていなかった、示唆したように。

私たちが到着した解決策:これは、重複が最初に削除されるので、我々は唯一の私たちが実際に標的にされた行を更新する働き

;WITH cteSourceStuff AS (
     SELECT AccountNumber, MpnUpgrade, MAX(DateConnected) maxConnDate 
     FROM ORDER_DETAIL, [ORDER] 
     WHERE ORDER_DETAIL.OrderID = [ORDER].OrderID 
     AND LEN(MpnUpgrade) > 10 
     AND OrderTypeID = 2 
     GROUP BY AccountNumber, MpnUpgrade 
    ) 
     UPDATE Laserbeak_Main.dbo.ACCOUNT_MPN set 
       DateUpgrade = cteSourceStuff.maxConnDate 
       FROM cteSourceStuff 
       WHERE cteSourceStuff.MpnUpgrade = ACCOUNT_MPN.Mpn 
       AND cteSourceStuff.AccountNumber = ACCOUNT_MPN.AccountNumber 
       AND DateUpgrade <> cteSourceStuff.maxConnDate 

。以前に問題があったのは、見つかった最初の行がSQLで更新されていたため、再実行したときや選択を実行したときに、キーに一致する行が返されていました。 ` SET ACC UPDATE DateUpgrade = ord.ConnectedDate dbo.ACCOUNT_MPNから内はdbo.ORDER ORDを登録しよう ACC:パフォーマンスをクエリに関連していますが、少しそれを構造し直す場合は、クエリが読みやすくなるかもしれない

関連する問題