次のように、いくつかの ID を一時テーブルに挿入して#A
います。
SELECT DISTINCT ID
INTO #A
FROM LocalDB.dbo.LocalTable1
WHERE ID NOT IN (SELECT DISTINCT ID FROM LocalDB.dbo.LocalTable2)
GO
CREATE INDEX TT ON #A(ID)
GO
前の段階で収集した識別子を使用して、リモートのリンク サーバーから情報を取得しようとしています。
クエリ 1:
SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (SELECT ID FROM #A)
クエリ 2:
SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
INNER JOIN #A Y
ON X.ID = Y.ID
次のクエリでは、一時テーブルの出力を取得し、行をコピーしてカンマ区切りのリストに適切にフォーマットし、手動でクエリに入れています。
クエリ 3:
SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (-- Put all identifiers here --)
クエリ1
と2
実行に 2 時間かかり、クエリ3
にかかる時間は 0 秒です (一時テーブルには約 200 行が含まれています)。何が起こっているのかわかりませんし、リモート サーバーが ID に関連するインデックスを持っているかどうかを確認する権限もありませんが、手動で作成されたクエリがすぐに実行され、問題が発生していることを示していることを確認するのは単純に困惑しています。クエリ最適化フェーズで。
ここで何がうまくいかないのか、またはクエリを高速化する方法についてのアイデアはありますか?