私は、データが多数のクライアント データベースに存在し、SQL を介して 1 つずつ中央のデータ リポジトリに取り込まれる環境で作業しています。
テスト プロセスを自動化するために、ユーザー指定のクライアント データベースのデータをバックアップ、パージ、および再抽出する、非常に優れた合理化されたプッシュ ボタン スクリプトを作成しました。次に、バックアップ テーブルからデータを復元します。コードを合理化するために同義語を多用します。
DELETE クエリでリモート スキャンが発生するパージ プロセスでパフォーマンスの問題が発生しています。これは、単にリモート クエリとして渡される INSERT/SELECT とまったく同じクエリです。
このINSERTはうまく機能します:
INSERT INTO origChild
SELECT child.*
FROM
bakParent par
JOIN bakChild child ON par.GUID = child.GUID
WHERE
par.DateInserted = '2013-08-12 20:30:42.920'
この DELETE はパフォーマンスが悪い:
DELETE
bakChild
FROM
bakParent par
JOIN bakChild child ON par.GUID = child.GUID
WHERE
par.DateInserted = '2013-08-12 20:30:42.920'
以下は、推定クエリ実行プランです。リモート スキャンは 500 万件以上のレコードをプルしますが、INSERT/SELECT は最大 16,000 件のレコードしか処理しません。
プランがこんなに違う理由がわかりません。リンク サーバーへのクエリがパフォーマンスの問題を引き起こす可能性があることは理解していますが、2 つの JOIN は同一です。私はそれらが同じであることを期待します。(または、DELETE を INSERT と同様に実行する方法が必要です。)
最初のクエリで INSERT 部分を削除すると、同じ実行プランになることを確認しました。
助言がありますか?