0

私は、データが多数のクライアント データベースに存在し、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 部分を削除すると、同じ実行プランになることを確認しました。

助言がありますか?

ここに画像の説明を入力

4

0 に答える 0