2016-03-28 30 views
0

私たちは、OPENQUERYとデータベースリンクサーバーを使用して、あるSQL Serverデータベースから別のSQL Serverデータベースにデータを移動するための一連のプログラムを用意しています。SQL Server DELETE OPENQUERYパフォーマンス

次のようなクエリでは予想よりも長い時間がかかることがわかりました。例えば

DELETE OPENQUERY(server, 'SELECT * FROM table WHERE pkf1 = ''v1'' AND pkf2 = ''v2''') 

、上記のように書き直された場合:

exec('DELETE * FROM table WHERE pkf1 = ''v1'' and pkf2 = ''v2''') at server 

又は

DELETE FROM server.schema.table WHERE pkf1 = 'v1' and pkf2 = 'v2' 

性能OPENQUERYを使用して分に比べ、わずか数秒です。

OPENQUERYのアプローチがなぜ非効率的であるのかを誰かが説明できますか?主キーインデックスは使用しませんか?

+0

以内に解決されhttps://support.microsoft.com/en-us/kb/309182 – jthalliens

+0

"予想以上に長い注文を取る"。あなたの期待は間違っています。私は、遅いクエリは、削除する前にレコードをローカルに転送し、速いクエリはそうではないと思います。 OPENQUERYは結果セットをローカルに返し、他のメソッドは返さない。私は 'atサーバ'の構文に慣れていませんでした。面白い。確かに、操作はクライアントではなくサーバーで行われます。 –

答えて

0

オープンクエリは、DELETEのような単純なクエリよりも優れハンドラを持っており、クエリはあなたがここに見ることができ、リモートサーバ