web-dev-qa-db-ja.com

FORCESEEKクエリヒントは、リンクサーバーで照会されるテーブルで使用できますか? (つまり、分散クエリの一部として)

FORCESEEKヒントを使用するクエリがあり、クエリを実行しているデータベースが存在するサーバーで正常に実行されます。別のサーバー(元のサーバーを対象とする)から同じ正確なクエリをリモートで実行しようとすると、次のエラーが発生します。

メッセージ7436、レベル16、状態1、行4テーブルまたはビュー 'TableBeingQueried'のFORCESEEKまたはFORCESCANヒントをリモートデータソースで使用できないため、クエリプロセッサはクエリプランを作成できませんでした。ヒントを削除して、クエリを再送信してください。

T-SQLの例:

SELECT DISTINCT Table3.Field5
FROM Server1.Database1.Table1 AS T1
INNER JOIN Server1.Database1.Table2 AS T2 WITH (FORCESEEK) -- Index exists for T2.Field2
    ON T1.Field1 = T2.Field2
INNER JOIN Server1.Database1.Table3 AS T3 WITH (FORCESEEK) -- Index exists for T3.Field3
    ON T2.Field4 = T3.Field3
2
J.D.

リモートデータソースでFROCESCANまたはFORCESEEKを使用することはできません。

リファレンス: ヒント(Transact-SQL)-テーブル

FORCESCANヒントには次の制限があります:

ヒントは、リモートデータソースには指定できません。

FORCESEEKヒントを使用する場合(インデックスパラメータの有無にかかわらず)、次のガイドラインを考慮してください:

ヒントは、リモートデータソースには指定できません。 FORCESEEKがインデックスヒントで指定されている場合はエラー7377が返され、インデックスヒントなしでFORCESEEKが使用されている場合はエラー8180が返されます。

3
SqlWorldWide

OPENQUERY()を使用して、リンクサーバーにクエリを実行し、FORCESEEK/FORCESCANヒントを適用できます。

例:

SELECT * FROM
OPENQUERY(
[Server1],
'SELECT DISTINCT Table3.Field5
FROM Server1.Database1.Table1 AS T1
INNER JOIN Server1.Database1.Table2 AS T2 WITH (FORCESEEK) -- Index exists for T2.Field2
    ON T1.Field1 = T2.Field2
INNER JOIN Server1.Database1.Table3 AS T3 WITH (FORCESEEK) -- Index exists for T3.Field3
    ON T2.Field4 = T3.Field3;');
2
Randi Vertongen