なぜ私のクエリが時間がかかりすぎるのか理解できない場合は、アドバイスを探して最適化してください。 SQL Server実行計画レビュー依頼
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結果サンプル:
ON acc.AccountNumber = dbo.AccountNumber AND ord.orderTypeID = 2' – Serge
'ORDER'テーブルの' AccountNumber'列は一意ではありませんか?もしそうなら、 'WHERE'節がデータセットを十分に制限しない限り、クエリは' ACCOUNT_MPN'テーブルの各行を複数回更新します。これを避けるには、 'FROM ORDER'の代わりに以下のことができます。 'DISTINCT'キーワードでサブクエリを使用します。 b)。 GROUP BY句でサブクエリを使用する。またはc)。既存の 'WHERE'節に条件を追加してください。 – Serge
実行計画をここに貼り付けてリンクを共有できますか: – TheGameiswar