ヒント (Transact-SQL) - QueryHints (Transact-SQL) - Query

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

クエリ ヒントは、指定されたヒントをクエリ全体で使用する必要があることを指定します。Query hints specify that the indicated hints should be used throughout the query. クエリ ヒントは、ステートメント内のすべての演算子に影響を与えます。They affect all operators in the statement. メイン クエリで UNION を使用する場合、UNION 操作を含む最後のクエリだけに OPTION 句を指定できます。If UNION is involved in the main query, only the last query involving a UNION operation can have the OPTION clause. クエリ ヒントは、OPTION 句の一部として指定します。Query hints are specified as part of the OPTION clause. 複数のクエリ ヒントが原因でクエリ オプティマイザーが有効なプランを生成できない場合は、エラー 8622 が発生します。Error 8622 occurs if one or more query hints cause the query optimizer not to generate a valid plan.

注意事項

通常、クエリにとって最適な実行プランが SQL ServerSQL Server クエリ オプティマイザーによって選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend only using hints as a last resort for experienced developers and database administrators.

適用対象:Applies to:

DELETEDELETE

INSERTINSERT

SELECTSELECT

UPDATEUPDATE

MERGEMERGE

構文Syntax

<query_hint > ::=   
{ { HASH | ORDER } GROUP   
  | { CONCAT | HASH | MERGE } UNION   
  | { LOOP | MERGE | HASH } JOIN   
  | EXPAND VIEWS   
  | FAST number_rows   
  | FORCE ORDER   
  | { FORCE | DISABLE } EXTERNALPUSHDOWN  
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX  
  | KEEP PLAN   
  | KEEPFIXED PLAN  
  | MAX_GRANT_PERCENT = percent  
  | MIN_GRANT_PERCENT = percent  
  | MAXDOP number_of_processors   
  | MAXRECURSION number   
  | NO_PERFORMANCE_SPOOL   
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )  
  | OPTIMIZE FOR UNKNOWN  
  | PARAMETERIZATION { SIMPLE | FORCED }   
  | RECOMPILE  
  | ROBUST PLAN   
  | USE HINT ( '<hint_name>' [ , ...n ] )
  | USE PLAN N'xml_plan'  | TABLE HINT ( exposed_object_name [ , <table_hint> [ [, ]...n ] ] )  
}  
  
<table_hint> ::=  
[ NOEXPAND ] {   
    INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value )  
  | FORCESEEK [( index_value ( index_column_name [,... ] ) ) ]  
  | FORCESCAN  
  | HOLDLOCK   
  | NOLOCK   
  | NOWAIT  
  | PAGLOCK   
  | READCOMMITTED   
  | READCOMMITTEDLOCK   
  | READPAST   
  | READUNCOMMITTED   
  | REPEATABLEREAD   
  | ROWLOCK   
  | SERIALIZABLE   
  | SNAPSHOT  
  | SPATIAL_WINDOW_MAX_CELLS = integer  
  | TABLOCK   
  | TABLOCKX   
  | UPDLOCK   
  | XLOCK  
}  

引数Arguments

{ HASH | ORDER } GROUP{ HASH | ORDER } GROUP
クエリの GROUP BY 句または DISTINCT 句に記述されている集計でハッシュまたは順序付けを使用することを指定します。Specifies that aggregations that the query's GROUP BY or DISTINCT clause describes should use hashing or ordering.

{ MERGE | HASH | CONCAT } UNION{ MERGE | HASH | CONCAT } UNION
UNION セットをマージ、ハッシュ、または連結することによって、すべての UNION 操作を実行することを指定します。Specifies that all UNION operations are run by merging, hashing, or concatenating UNION sets. 複数の UNION ヒントを指定した場合、クエリ オプティマイザーは指定されたヒントの中から最も負荷の軽い方法を選択します。If more than one UNION hint is specified, the query optimizer selects the least expensive strategy from those hints specified.

{ LOOP | MERGE | HASH } JOIN{ LOOP | MERGE | HASH } JOIN
LOOP JOIN、MERGE JOIN、または HASH JOIN によって、すべての結合操作がクエリ全体で実行されることを指定します。Specifies all join operations are performed by LOOP JOIN, MERGE JOIN, or HASH JOIN in the whole query. 結合ヒントを複数指定した場合は、可能なヒントの中から最も負荷の軽い方法がオプティマイザーによって選択されます。If you specify more than one join hint, the optimizer selects the least expensive join strategy from the allowed ones.

同じクエリの FROM 句の中で、特定のテーブルのペアに対して結合ヒントを指定した場合、2 つのテーブルの結合ではこの結合ヒントが優先されます。If you specify a join hint in the same query's FROM clause for a specific table pair, this join hint takes precedence in the joining of the two tables. ただし、クエリ ヒントは引き続き有効です。The query hints, though, must still be honored. テーブルのペアの結合ヒントは、クエリ ヒント内で許可される結合方法の選択を制限できるだけです。The join hint for the pair of tables may only restrict the selection of allowed join methods in the query hint. 詳細については、「結合ヒント (Transact-SQL)」を参照してください。For more information, see Join Hints (Transact-SQL).

EXPAND VIEWSEXPAND VIEWS
インデックス付きビューが展開済みであることを指定します。Specifies the indexed views are expanded. また、クエリ オプティマイザーで、インデックス付きビューがクエリ部分の置換であると見なされないように指定します。Also specifies the query optimizer won't consider any indexed view as a replacement for any query part. ビューが展開されるのは、クエリ テキスト内のビュー名がビュー定義で置換される場合です。A view is expanded when the view definition replaces the view name in the query text.

このクエリ ヒントは、インデックス付きビューを直接使用することを実質的に禁止し、クエリ プラン内のインデックス付きビューにインデックスを指定します。This query hint virtually disallows direct use of indexed views and indexes on indexed views in the query plan.

クエリの SELECT 部分にビューへの直接参照がある場合、インデックス付きビューは縮小されたままです。The indexed view remains condensed if there's a direct reference to the view in the query's SELECT part. WITH (NOEXPAND) or WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) ) を指定した場合も、ビューは縮小されたままです。The view also remains condensed if you specify WITH (NOEXPAND) or WITH (NOEXPAND, INDEX(index_value_ [ ,...n ] ) ). クエリ ヒント NOEXPAND の詳細については、「NOEXPAND の使用」を参照してください。For more information about the query hint NOEXPAND, see Using NOEXPAND.

ヒントは、INSERT、UPDATE、MERGE、および DELETE ステートメントのビューを含め、ステートメントの SELECT 部分のビューにのみ影響します。The hint only affects the views in the statements' SELECT part, including those views in INSERT, UPDATE, MERGE, and DELETE statements.

FAST number_rowsFAST number_rows
最初の number_rows を高速検索するためにクエリの最適化を行うことを指定します。Specifies that the query is optimized for fast retrieval of the first number_rows. この結果は負以外の整数です。This result is a nonnegative integer. 最初の number_rows を返した後、クエリは実行を続け、完全な結果セットを作成します。After the first number_rows are returned, the query continues execution and produces its full result set.

FORCE ORDERFORCE ORDER
クエリの構文に示されている結合順序が、クエリの最適化中、保持されることを指定します。Specifies that the join order indicated by the query syntax is preserved during query optimization. FORCE ORDER を使用しても、クエリ オプティマイザーのロールの逆引き動作に影響はありません。Using FORCE ORDER doesn't affect possible role reversal behavior of the query optimizer.

注意

MERGE ステートメント内で、WHEN SOURCE NOT MATCHED 句が指定されていない限り、既定の結合順序としてソース テーブルはターゲット テーブルよりも前にアクセスされます。In a MERGE statement, the source table is accessed before the target table as the default join order, unless the WHEN SOURCE NOT MATCHED clause is specified. FORCE ORDER を指定すると、この既定の動作が維持されます。Specifying FORCE ORDER preserves this default behavior.

{FORCE |無効にする EXTERNALPUSHDOWN}{ FORCE | DISABLE } EXTERNALPUSHDOWN
強制または式を使用して hadoop の該当する計算のプッシュ ダウンを無効にします。Force or disable the pushdown of the computation of qualifying expressions in Hadoop. PolyBase を使用してクエリにのみ適用されます。Only applies to queries using PolyBase. Azure ストレージにはプッシュダウンされません。Won't push down to Azure storage.

KEEP PLANKEEP PLAN
クエリ オプティマイザーに対して、クエリに推定される再コンパイルしきい値を緩和することを指定します。Forces the query optimizer to relax the estimated recompile threshold for a query. 推定される再コンパイルしきい値を指定すると、以下のいずれかのステートメントを実行して、予測した回数のインデックス列変更がテーブルに加えられた場合に、クエリの自動再コンパイルが開始されます。The estimated recompile threshold starts an automatic recompile for the query when the estimated number of indexed column changes have been made to a table by running one of the following statements:

  • UPDATEUPDATE
  • DELETEDELETE
  • MERGEMERGE
  • INSERTINSERT

KEEP PLAN を指定することによって、テーブルに複数の更新が加えられても、クエリは頻繁に再コンパイルされません。Specifying KEEP PLAN makes sure a query won't be recompiled as frequently when there are multiple updates to a table.

KEEPFIXED PLANKEEPFIXED PLAN
統計情報の変更に応じてクエリを再コンパイルしないようにクエリ オプティマイザーを設定します。Forces the query optimizer not to recompile a query because of changes in statistics. KEEPFIXED PLAN を指定することによって、クエリの基になるテーブルのスキーマが変更された場合、またはそのテーブルに対して sp_recompile が実行された場合のみ、クエリが再コンパイルされます。Specifying KEEPFIXED PLAN makes sure that a query recompiles only if the schema of the underlying tables changes or if sp_recompile runs against those tables.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEXIGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
適用対象: SQL Server 2012 (11.x)SQL Server 2012 (11.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017.

クエリで非クラスター化メモリ最適化列ストア インデックスが使用されないようにします。Prevents the query from using a nonclustered memory optimized columnstore index. クエリに、列ストア インデックスの使用を回避するクエリ ヒントと、列ストア インデックスを使用するインデックス ヒントがある場合、ヒントが競合してクエリはエラーを返します。If the query contains the query hint to avoid the use of the columnstore index, and an index hint to use a columnstore index, the hints are in conflict and the query returns an error.

MAX_GRANT_PERCENT = percentMAX_GRANT_PERCENT = percent
最大メモリ サイズ (% 単位) を付与します。The maximum memory grant size in PERCENT. クエリは、この制限を超えることはできないことが保証されます。The query is guaranteed not to exceed this limit. Resource Governor の設定がこのヒントで指定されている値より小さい場合、実際の制限はこれよりも小さくなる可能性があります。The actual limit can be lower if the Resource Governor setting is lower than the value specified by this hint. 有効な値では、0.0 ~ 100.0 します。Valid values are between 0.0 and 100.0.

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

MIN_GRANT_PERCENT = percentMIN_GRANT_PERCENT = percent
最低限のメモリ サイズ (% 単位) を付与する = 既定の制限の % です。The minimum memory grant size in PERCENT = % of default limit. クエリは、少なくとも、クエリの開始に必要なメモリが必要となるために、(必要なメモリ、最小の許可) の最大値を取得することが保証します。The query is guaranteed to get MAX(required memory, min grant) because at least required memory is needed to start a query. 有効な値では、0.0 ~ 100.0 します。Valid values are between 0.0 and 100.0.

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

MAXDOP numberMAXDOP number
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

sp_configuremax degree of parallelism 構成オプションをオーバーライドします。Overrides the max degree of parallelism configuration option of sp_configure. また、このオプションを指定してクエリの Resource Governor もオーバーライドします。Also overrides the Resource Governor for the query specifying this option. MAXDOP クエリ ヒントは、sp_configure で構成されている値を超えて指定できます。The MAXDOP query hint can exceed the value configured with sp_configure. MAXDOP の値がリソース ガバナーで構成されている値を超える場合は、「ALTER WORKLOAD GROUP (Transact-SQL)」で説明されているように、データベース エンジンDatabase Engineでリソース ガバナーの MAXDOP 値が使用されます。If MAXDOP exceeds the value configured with Resource Governor, the データベース エンジンDatabase Engine uses the Resource Governor MAXDOP value, described in ALTER WORKLOAD GROUP (Transact-SQL). MAXDOP クエリ ヒントを使用している場合は、max degree of parallelism 構成オプションで使用されるすべての意味ルールを適用できます。All semantic rules used with the max degree of parallelism configuration option are applicable when you use the MAXDOP query hint. 詳細については、「 max degree of parallelism サーバー構成オプションの構成」を参照してください。For more information, see Configure the max degree of parallelism Server Configuration Option.

警告

MAXDOP が 0 に設定されている場合、サーバーでは最大限の並列処理が実行されます。If MAXDOP is set to zero, then the server chooses the max degree of parallelism.

MAXRECURSION number MAXRECURSION number
このクエリで許可される最大再帰数を指定します。Specifies the maximum number of recursions allowed for this query. number は、0 ~ 32,767 の負ではない整数です。number is a nonnegative integer between 0 and 32,767. 0 を指定した場合、制限は適用されません。When 0 is specified, no limit is applied. このオプションが指定されない場合、サーバーの既定の上限値である 100 が使用されます。If this option isn't specified, the default limit for the server is 100.

クエリの実行中に MAXRECURSION の指定した上限値または既定上限値に達した場合、クエリは終了し、エラーが返されます。When the specified or default number for MAXRECURSION limit is reached during query execution, the query ends and an error returns.

このエラーのため、ステートメントのすべての効果がロールバックされます。Because of this error, all effects of the statement are rolled back. ステートメントが SELECT ステートメントであった場合、結果の一部が返されるか、結果がまったく返されないかのいずれかになります。If the statement is a SELECT statement, partial results or no results may be returned. 結果の一部が返された場合でも、指定した最大再帰レベルを超える再帰レベルのすべての行は含まれていない可能性があります。Any partial results returned may not include all rows on recursion levels beyond the specified maximum recursion level.

詳細については、「WITH common_table_expression (Transact-SQL)」を参照してください。For more information, see WITH common_table_expression (Transact-SQL).

NO_PERFORMANCE_SPOOLNO_PERFORMANCE_SPOOL
適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017.

Spool 操作は、(を除く、計画、スプールが有効な更新のセマンティクスを保証するために必要な場合) のクエリ プランに追加されないようにします。Prevents a spool operator from being added to query plans (except for the plans when spool is required to guarantee valid update semantics). 一部のシナリオでは、spool 演算子を使用するとパフォーマンスが低下する可能性があります。The spool operator may reduce performance in some scenarios. たとえば、spool のサイズは、tempdb を使用し、スプール操作を実行している多くの同時実行クエリがある場合に、tempdb の競合が発生することがあります。For example, the spool uses tempdb and tempdb contention can occur if there are many concurrent queries running with the spool operations.

OPTIMIZE FOR ( _@variable\_name_ { UNKNOWN | = literal_constant } [ , ...n ] )OPTIMIZE FOR ( _@variable\_name_ { UNKNOWN | = literal_constant } [ , ...n ] )
クエリをコンパイルおよび最適化するときにローカル変数に対して特定の値を使用するように、クエリ オプティマイザーに指示します。Instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. この値はクエリを最適化する過程でのみ使用され、クエリの実行時には使用されません。The value is used only during query optimization, and not during query execution.

@variable\_name_@variable\_name_
クエリで使用されるローカル変数の名前です。このローカル変数に OPTIMIZE FOR クエリ ヒントで使用する値を割り当てます。Is the name of a local variable used in a query, to which a value may be assigned for use with the OPTIMIZE FOR query hint.

UNKNOWNUNKNOWN
クエリ オプティマイザーでのクエリの最適化時に、初期値の代わりに統計データを使用してローカル変数の値を決定することを指定します。Specifies that the query optimizer uses statistical data instead of the initial value to determine the value for a local variable during query optimization.

literal_constantliteral_constant
OPTIMIZE FOR クエリ ヒントで使用する _@variable\_name_ に割り当てるリテラル定数値です。Is a literal constant value to be assigned _@variable\_name_ for use with the OPTIMIZE FOR query hint. literal_constant は、クエリの最適化の過程でのみ使用され、クエリ実行時に _@variable\_name_ の値としては使用されません。literal_constant is used only during query optimization, and not as the value of @variable\_name_ during query execution. literal_constant には、リテラル定数として表現できる任意の SQL ServerSQL Server システム データ型を指定できます。literal_constant can be of any SQL ServerSQL Server system data type that can be expressed as a literal constant. literal_constant のデータ型は、@variable\_name_ がクエリ内で参照するデータ型に暗黙的に変換できる必要があります。The data type of literal_constant must be implicitly convertible to the data type that _@variable\_name_ references in the query.

OPTIMIZE FOR は、オプティマイザーの既定のパラメーター検出動作を無効にする場合に使用できます。OPTIMIZE FOR can counteract the optimizer's default parameter detection behavior. また、プラン ガイドを作成するときにも OPTIMIZE FOR を使用します。Also use OPTIMIZE FOR when you create plan guides. 詳細については、「ストアド プロシージャの再コンパイル」を参照してください。For more information, see Recompile a Stored Procedure.

OPTIMIZE FOR UNKNOWNOPTIMIZE FOR UNKNOWN
クエリ オプティマイザーでクエリをコンパイルおよび最適化するときに、すべてのローカル変数に対して初期値の代わりに統計データを使用することを指定します。Instructs the query optimizer to use statistical data instead of the initial values for all local variables when the query is compiled and optimized. この最適化には、強制パラメーター化によって作成されたパラメーターも含まれます。This optimization includes parameters created with forced parameterization.

同一のクエリ ヒント内で OPTIMIZE FOR @variable_name = literal_constant と OPTIMIZE FOR UNKNOWN が使用されている場合、クエリ オプティマイザーでは、特定の値に対しては指定された literal_constant が使用されます。If you use OPTIMIZE FOR @variable_name = literal_constant and OPTIMIZE FOR UNKNOWN in the same query hint, the query optimizer will use the literal_constant specified for a specific value. クエリ オプティマイザーでは、残りの変数値には UNKNOWN が使用されます。The query optimizer will use UNKNOWN for the rest of the variable values. これらの値はクエリを最適化する過程でのみ使用され、クエリの実行時には使用されません。The values are used only during query optimization, and not during query execution.

PARAMETERIZATION { SIMPLE | FORCED }PARAMETERIZATION { SIMPLE | FORCED }
クエリのコンパイル時に SQL ServerSQL Server クエリ オプティマイザーがそのクエリに適用するパラメーター化のルールを指定します。Specifies the parameterization rules that the SQL ServerSQL Server query optimizer applies to the query when it's compiled.

重要

PARAMETERIZATION クエリ ヒントは、PARAMETERIZATION データベース SET オプションの現在の設定をオーバーライドするため、プラン ガイドの内部でのみ指定できます。The PARAMETERIZATION query hint can only be specified inside a plan guide to override the current setting of the PARAMETERIZATION database SET option. クエリの中で直接指定することはできません。It can't be specified directly within a query.
詳細については、「プラン ガイドを使用したクエリのパラメーター化動作の指定」を参照してください。For more information, see Specify Query Parameterization Behavior by Using Plan Guides.

SIMPLE は、クエリ オプティマイザーに対して簡易パラメーター化を試行するように指示します。SIMPLE instructs the query optimizer to attempt simple parameterization. FORCED は、クエリ オプティマイザーに対して強制パラメーター化を試行するように指示します。FORCED instructs the query optimizer to attempt forced parameterization. 詳細については、「クエリ処理アーキテクチャ ガイド」の「強制パラメーター化」および「クエリ処理アーキテクチャ ガイド」の「簡易パラメーター化」を参照してください。For more information, see Forced Parameterization in the Query Processing Architecture Guide, and Simple Parameterization in the Query Processing Architecture Guide.

RECOMPILERECOMPILE
SQL Server データベース エンジンSQL Server Database Engine に、クエリの新しい一時的なプランを生成し、クエリ実行完了直後にそのプランを破棄するよう指示します。Instructs the SQL Server データベース エンジンSQL Server Database Engine to generate a new, temporary plan for the query and immediately discard that plan after the query completes execution. 生成されたクエリ プランは、RECOMPILE ヒントを指定しないで同じクエリを実行したときにキャッシュに格納されるプランを置き換えません。The generated query plan doesn't replace a plan stored in cache when the same query runs without the RECOMPILE hint. RECOMPILE を指定しない場合、データベース エンジンDatabase Engineはクエリ プランをキャッシュして再利用します。Without specifying RECOMPILE, the データベース エンジンDatabase Engine caches query plans and reuses them. クエリ プランをコンパイルする場合、RECOMPILE クエリ ヒントは、クエリ内のローカル変数の現在値を使用します。When compiling query plans, the RECOMPILE query hint uses the current values of any local variables in the query. クエリがストアド プロシージャ内にある場合は、任意のパラメーターに渡された現在値を使用します。If the query is inside a stored procedure, the current values passed to any parameters.

RECOMPILE は、ストアド プロシージャを作成する代わりに使用すると便利です。RECOMPILE is a useful alternative to creating a stored procedure. RECOMPILE は、ストアド プロシージャ全体ではなくその中のクエリのサブセットだけを再コンパイルする必要がある場合に、WITH RECOMPILE 句を使用します。RECOMPILE uses the WITH RECOMPILE clause when only a subset of queries inside the stored procedure, instead of the whole stored procedure, must be recompiled. 詳細については、「ストアド プロシージャの再コンパイル」を参照してください。For more information, see Recompile a Stored Procedure. RECOMPILE はプラン ガイドを作成するときにも利用できます。RECOMPILE is also useful when you create plan guides.

ROBUST PLANROBUST PLAN
クエリ オプティマイザーで、最大許容行サイズで動作するプランを試行するよう設定します。ただし、この場合は性能が低下する可能性があります。Forces the query optimizer to try a plan that works for the maximum potential row size, possibly at the expense of performance. 中間テーブルや演算子が入力行よりも大きな行を格納し、処理しなければならない可能性があります。When the query is processed, intermediate tables and operators may have to store and process rows that are wider than any one of the input rows when the query is processed. 行があまりに大きいと、演算子によっては行を処理できない場合もあります。The rows may be so wide that, sometimes, the particular operator can't process the row. 行がそれほど大きい場合、クエリの実行中に データベース エンジンDatabase Engine からエラーが出力されます。If rows are that wide, the データベース エンジンDatabase Engine produces an error during query execution. ROBUST PLAN を使用することで、クエリ オプティマイザーに対して、このような問題を発生するクエリ プランを考慮しないことを指示します。By using ROBUST PLAN, you instruct the query optimizer not to consider any query plans that may run into this problem.

このようなプランが可能でない場合は、クエリ実行の後でエラー検出を行うのではなく、クエリ オプティマイザーがエラーを返します。If such a plan isn't possible, the query optimizer returns an error instead of deferring error detection to query execution. 行は可変長列で構成されている可能性があります。データベース エンジンDatabase Engineでは、データベース エンジンDatabase Engineが処理できる範囲を超えた最大可能サイズを持つように、行を定義できます。Rows may contain variable-length columns; the データベース エンジンDatabase Engine allows for rows to be defined that have a maximum potential size beyond the ability of the データベース エンジンDatabase Engine to process them. 通常、可能な最大サイズに関係なく、アプリケーションはデータベース エンジンDatabase Engineの処理能力で実際に対応できるサイズの行を格納します。Generally, despite the maximum potential size, an application stores rows that have actual sizes within the limits that the データベース エンジンDatabase Engine can process. データベース エンジンDatabase Engine が長すぎる行を検出した場合は、実行エラーが返されます。If the データベース エンジンDatabase Engine comes across a row that is too long, an execution error is returned.

USE HINT ( 'hint_name' )USE HINT ( 'hint_name' )
適用対象: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 以降) および SQL DatabaseSQL DatabaseApplies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1) and SQL DatabaseSQL Database.

1 つ以上の追加のヒントをクエリ プロセッサに指定します。Provides one or more additional hints to the query processor. 追加のヒントは、ヒント名を単一引用符で囲んで指定します。The additional hints are specified by a hint name inside single quotation marks.

次のヒント名がサポートされています。The following hint names are supported:

  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
    SQL Server 2014 (12.x)SQL Server 2014 (12.x) 以降のクエリ オプティマイザーの基数推定モデルで、結合に対して、既定の基本含有の推定の代わりに、単純な含有の推定を使用して、SQL ServerSQL Server にクエリ プランを生成させます。Causes SQL ServerSQL Server to generate a query plan using the Simple Containment assumption instead of the default Base Containment assumption for joins, under the query optimizer Cardinality Estimation model of SQL Server 2014 (12.x)SQL Server 2014 (12.x) or newer. このヒント名は、トレース フラグ 9476 と同等です。This hint name is parallel to trace flag 9476.

  • 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
    相関関係を考慮するフィルターの AND 述語を見積もるときに、最低限の選択度を使用して SQL ServerSQL Server にプランを生成させます。Causes SQL ServerSQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for correlation. このヒント名は、SQL Server 2012 (11.x)SQL Server 2012 (11.x) 以前のバージョンのカーディナリティ推定モデルでトレース フラグ 4137 を使用した場合と同等であり、トレース フラグ 9471 を SQL Server 2014 (12.x)SQL Server 2014 (12.x) 以降のバージョンのカーディナリティ推定モデルで使用した場合と同じ効果があります。This hint name is parallel to trace flag 4137 when used with cardinality estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions, and has similar effect when trace flag 9471 is used with cardinality estimation model of SQL Server 2014 (12.x)SQL Server 2014 (12.x) or higher.

  • 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS''DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
    バッチ モード アダプティブ結合を無効にします。Disables batch mode adaptive joins. 詳細については、「バッチ モード アダプティブ結合」を参照してください。For more information, see Batch mode Adaptive Joins.

  • 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
    バッチ モード メモリ許可フィードバックを無効にします。Disables batch mode memory grant feedback. 詳細については、「バッチ モード メモリ許可フィードバック」を参照してください。For more information, see Batch mode memory grant feedback.

  • 'DISABLE_DEFERRED_COMPILATION_TV''DISABLE_DEFERRED_COMPILATION_TV'
    テーブル変数の遅延コンパイルを無効にします。Disables table variable deferred compilation. 詳細については、「テーブル変数の遅延コンパイル」をご覧ください。For more information, see Table variable deferred compilation.

  • 'DISABLE_INTERLEAVED_EXECUTION_TVF''DISABLE_INTERLEAVED_EXECUTION_TVF'
    複数ステートメントのテーブル値関数のインターリーブ実行を無効にします。Disables interleaved execution for multi-statement table-valued functions. 詳細については、「複数ステートメントのテーブル値関数のインターリーブ実行」を参照してください。For more information, see Interleaved execution for multi-statement table-valued functions.

  • 'DISABLE_OPTIMIZED_NESTED_LOOP''DISABLE_OPTIMIZED_NESTED_LOOP'
    クエリ プランを生成するときに、最適化された入れ子になったループ結合に対して並べ替え操作 (バッチ ソート) を使用しないように、クエリ プロセッサに指示します。Instructs the query processor not to use a sort operation (batch sort) for optimized nested loop joins when generating a query plan. このヒント名は、トレース フラグ 2340 と同等です。This hint name is parallel to trace flag 2340.

  • 'DISABLE_OPTIMIZER_ROWGOAL' 'DISABLE_OPTIMIZER_ROWGOAL'
    次のいずれかのキーワードを含むクエリで行の目標の変更を使用しないプランを SQL Server に生成させます。Causes SQL Server to generate a plan that doesn't use row goal modifications with queries that contain these keywords:

    • TOPTOP
    • OPTION (FAST N)OPTION (FAST N)
    • ININ
    • EXISTSEXISTS

    このヒント名は、トレース フラグ 4138 と同等です。This hint name is parallel to trace flag 4138.

  • 'DISABLE_PARAMETER_SNIFFING''DISABLE_PARAMETER_SNIFFING'
    1 つまたは複数のパラメーターを指定してクエリをコンパイルする際に、平均データ分布を使用するようにクエリ オプティマイザーに指示します。Instructs query optimizer to use average data distribution while compiling a query with one or more parameters. この指示により、クエリをコンパイルするときに最初に使用されていたパラメーター値にクエリ プランが依存しなくなります。This instruction makes the query plan independent on the parameter value that was first used when the query was compiled. このヒント名は、トレース フラグ 4136 を指定した場合、またはデータベース スコープ構成を PARAMETER_SNIFFING=OFF に設定した場合と同等です。This hint name is parallel to trace flag 4136 or Database Scoped Configuration setting PARAMETER_SNIFFING=OFF.

  • 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK''DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
    行モード メモリ許可フィードバックを無効にします。Disables row mode memory grant feedback. 詳細については、「行モード メモリ許可フィードバック」を参照してください。For more information, see Row mode memory grant feedback.

  • 'DISABLE_TSQL_SCALAR_UDF_INLINING''DISABLE_TSQL_SCALAR_UDF_INLINING'
    スカラー UDF のインライン化を無効にします。Disables scalar UDF inlining. 詳細については、「スカラー UDF のインライン化」を参照してください。For more information, see Scalar UDF Inlining.

  • 'DISALLOW_BATCH_MODE''DISALLOW_BATCH_MODE'
    バッチ モード実行を無効にします。Disables batch mode execution. 詳細については、「実行モード」を参照してください。For more information, see Execution modes.

  • 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS''ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
    カーディナリティ推定が必要なすべての先頭のインデックス列に対して、クイック統計情報 (ヒストグラム修正) を自動的に生成できるようにします。Enables automatically generated quick statistics (histogram amendment) for any leading index column for which cardinality estimation is needed. カーディナリティを推定するために使用されるヒストグラムは、この列の実際の最大値または最小値を考慮するクエリのコンパイル時に調整されます。The histogram used to estimate cardinality will be adjusted at query compile time to account for actual maximum or minimum value of this column. このヒント名は、トレース フラグ 4139 と同等です。This hint name is parallel to trace flag 4139.

  • 'ENABLE_QUERY_OPTIMIZER_HOTFIXES''ENABLE_QUERY_OPTIMIZER_HOTFIXES'
    クエリ オプティマイザー修正プログラム (SQL Server の累積的な更新プログラムとサービス パックでリリースされた変更) を有効にします。Enables query optimizer hotfixes (changes released in SQL Server Cumulative Updates and Service Packs). このヒント名は、トレース フラグ 4199 を指定した場合、またはデータベース スコープ構成を QUERY_OPTIMIZER_HOTFIXES=ON に設定した場合と同等です。This hint name is parallel to trace flag 4199 or Database Scoped Configuration setting QUERY_OPTIMIZER_HOTFIXES=ON.

  • 'FORCE_DEFAULT_CARDINALITY_ESTIMATION''FORCE_DEFAULT_CARDINALITY_ESTIMATION'
    現在のデータベース互換性レベルに対応するカーディナリティ推定モデルを使用するようにクエリ オプティマイザーを設定します。Forces the Query Optimizer to use Cardinality Estimation model that corresponds to the current database compatibility level. このヒントを使用して、データベース スコープ構成の LEGACY_CARDINALITY_ESTIMATION=ON 設定またはトレース フラグ 9481 をオーバーライドします。Use this hint to override Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON or trace flag 9481.

  • 'FORCE_LEGACY_CARDINALITY_ESTIMATION' 'FORCE_LEGACY_CARDINALITY_ESTIMATION'
    SQL Server 2012 (11.x)SQL Server 2012 (11.x) 以前のバージョンの 基数推定モデルを使用するようにクエリ オプティマイザーを設定します。Forces the query optimizer to use Cardinality Estimation model of SQL Server 2012 (11.x)SQL Server 2012 (11.x) and earlier versions. このヒント名は、トレース フラグ 9481 を指定した場合、またはデータベース スコープ構成を LEGACY_CARDINALITY_ESTIMATION=ON に設定した場合と同等です。This hint name is parallel to trace flag 9481 or Database Scoped Configuration setting LEGACY_CARDINALITY_ESTIMATION=ON.

  • 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
    クエリ レベルでクエリ オプティマイザーの動作を強制します。Forces the query optimizer behavior at a query level. この動作は、クエリがデータベース互換レベル n でコンパイルされている場合と同様に実行されます (n はサポートされているデータベース互換レベルです)。This behavior happens as if the query was compiled with database compatibility level n, where n is a supported database compatibility level. 現在サポートされている n の値の一覧については、「sys.dm_exec_valid_use_hints」をご覧ください。Refer to sys.dm_exec_valid_use_hints for a list of currently supported values for n. 適用対象: SQL ServerSQL Server (SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU10 以降)。Applies to: SQL ServerSQL Server (starting with SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU10).

    注意

    既定またはレガシのカーディナリティ推定の設定が、データベース スコープ構成、トレース フラグ、または QUERYTRACEON などの別のクエリ ヒントによって適用されている場合、QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n ヒントはそれをオーバーライドしません。The QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n hint doesn't override default or legacy cardinality estimation setting, if it's forced through database scoped configuration, trace flag or another query hint such as QUERYTRACEON.
    このヒントは、クエリ オプティマイザーの動作にのみ影響します。This hint only affects the behavior of the query optimizer. 特定のデータベース機能の可用性など、データベース互換レベルに依存する可能性のある SQL ServerSQL Server の他の機能には影響しません。It doesn't affect other features of SQL ServerSQL Server that may depend on the database compatibility level, such as the availability of certain database features.
    このヒントの詳細については、「Developer’s Choice:Hinting Query Execution model」(開発者の選択: クエリ ヒント実行モデル) をご覧ください。To learn more about this hint, see Developer's Choice: Hinting Query Execution model.

  • 'QUERY_PLAN_PROFILE''QUERY_PLAN_PROFILE'
    クエリの軽量プロファイリングを有効にします。Enables lightweight profiling for the query. この新しいヒントを含むクエリが完了したら、新しい拡張イベントである query_plan_profile が起動されます。When a query that contains this new hint finishes, a new Extended Event, query_plan_profile, is fired. この拡張イベントでは、実行の統計と query_post_execution_showplan 拡張イベントのような実際の実行プラン XML が公開されますが、新しいヒントを含むクエリのみが対象です。This extended event exposes execution statistics and actual execution plan XML similar to the query_post_execution_showplan extended event but only for queries that contains the new hint. 適用対象: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 CU3 および SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU11 以降)。Applies to: SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 CU3 and SQL Server 2017 (14.x)SQL Server 2017 (14.x) CU11).

    注意

    query_post_execution_showplan 拡張イベントの収集を有効にした場合は、サーバー上で実行しているすべてのクエリに標準的なプロファイリング インフラストラクチャが追加されるので、全体的なサーバー パフォーマンスに影響する可能性があります。If you enable collecting the query_post_execution_showplan extended event, this will add standard profiling infrastructure to every query that is running on the server and therefore may affect overall server performance.
    query_thread_profile 拡張イベントのコレクションを有効にして軽量プロファイリング インフラストラクチャを代わりに使用する場合、パフォーマンス オーバーヘッドがはるかに少なくなりますが、依然として全体的なサーバー パフォーマンスに影響します。If you enable the collection of query_thread_profile extended event to use lightweight profiling infrastructure instead, this will result in much less performance overhead but will still affect overall server performance.
    query_plan_profile 拡張イベントを有効にした場合、軽量プロファイリング インフラストラクチャは QUERY_PLAN_PROFILE を使用して実行されるクエリに対してのみ有効になるので、サーバー上の他のワークロードには影響しません。If you enable the query_plan_profile extended event, this will only enable the lightweight profiling infrastructure for a query that executed with the QUERY_PLAN_PROFILE and therefore will not affect other workloads on the server. このヒントを使用して、サーバー ワークロードの他の部分に影響を与えずに特定のクエリをプロファイリングします。Use this hint to profile a specific query without affecting other parts of the server workload. 軽量プロファイリングの詳細については、「クエリ プロファイリング インフラストラクチャ」をご覧ください。To learn more about lightweight profiling, see Query Profiling Infrastructure.

サポートされているすべての USE HINT 名の一覧は、動的管理ビューの sys.dm_exec_valid_use_hints を使用して照会できます。The list of all supported USE HINT names can be queried using the dynamic management view sys.dm_exec_valid_use_hints.

ヒント

ヒント名では大文字と小文字が区別されません。Hint names are case-insensitive.

重要

一部の USE HINT ヒントは、グローバルまたはセッション レベルで有効になっているトレース フラグや、データベース スコープ構成設定と競合する場合があります。Some USE HINT hints may conflict with trace flags enabled at the global or session level, or database scoped configuration settings. この場合、クエリ レベル ヒント (USE HINT) が常に優先されます。In this case, the query level hint (USE HINT) always takes precedence. USE HINT が別のクエリ ヒントまたはクエリ レベルで (QUERYTRACEON などによって) 有効になっているトレース フラグと競合する場合、クエリを実行しようとすると、SQL ServerSQL Server によってエラーが生成されます。If a USE HINT conflicts with another query hint, or a trace flag enabled at the query level (such as by QUERYTRACEON), SQL ServerSQL Server will generate an error when trying to execute the query.

USE PLAN N 'xml_plan' USE PLAN N 'xml_plan'
'xml_plan' で指定されているクエリの既存のクエリ プランを使用するように、クエリ オプティマイザーを設定します。Forces the query optimizer to use an existing query plan for a query that is specified by 'xml_plan'. USE PLAN は、INSERT、UPDATE、MERGE、または DELETE の各ステートメントに指定することはできません。USE PLAN can't be specified with INSERT, UPDATE, MERGE, or DELETE statements.

TABLE HINT (exposed_object_name [ , <table_hint> [,]...n ] ] ) では、exposed_object_name に対応するテーブルまたはビューに、指定したテーブル ヒントを適用します。TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] ) Applies the specified table hint to the table or view that corresponds to exposed_object_name. プラン ガイドのコンテキスト内でのみ、テーブル ヒントをクエリ ヒントとして使用することをお勧めします。We recommend using a table hint as a query hint only in the context of a plan guide.

exposed_object_name には、次のいずれかの参照を指定できます。exposed_object_name can be one of the following references:

  • クエリの FROM 句内でテーブルまたはビューに対して別名を使用する場合、exposed_object_name は別名です。When an alias is used for the table or view in the FROM clause of the query, exposed_object_name is the alias.

  • 別名を使用しない場合、exposed_object_name は、FROM 句で参照されているテーブルまたはビューと完全に一致している必要があります。When an alias isn't used, exposed_object_name is the exact match of the table or view referenced in the FROM clause. たとえば、2 つの部分で構成される名前を使用してテーブルまたはビューが参照されている場合、exposed_object_name は、2 つの部分で構成される同じ名前です。For example, if the table or view is referenced using a two-part name, exposed_object_name is the same two-part name.

テーブル ヒントも指定せずに exposed_object_name を指定した場合、オブジェクトのテーブル ヒントの一部としてクエリに指定された任意のインデックスは無視されます。When you specify exposed_object_name without also specifying a table hint, any indexes you specify in the query as part of a table hint for the object are disregarded. 次に、クエリ オプティマイザーによってインデックスの使用が決まります。The query optimizer then determines index usage. この手法を使用すると、元のクエリに変更を加えることができない場合に INDEX テーブル ヒントの効果を除去できます。You can use this technique to eliminate the effect of an INDEX table hint when you can't modify the original query. 例 J を参照してください。See Example J.

<table_hint> ::= { [ NOEXPAND ] { INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value ) | FORCESEEK [(index_value(index_column_name [,... ] )) ]| FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | SNAPSHOT | SPATIAL_WINDOW_MAX_CELLS | TABLOCK | TABLOCKX | UPDLOCK | XLOCK } では、exposed_object_name に対応するテーブルまたはビューにクエリ ヒントとして適用するテーブル ヒントを指定します。<table_hint> ::= { [ NOEXPAND ] { INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value ) | FORCESEEK [(index_value(index_column_name [,... ] )) ]| FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | SNAPSHOT | SPATIAL_WINDOW_MAX_CELLS | TABLOCK | TABLOCKX | UPDLOCK | XLOCK } Is the table hint to apply to the table or view that corresponds to exposed_object_name as a query hint. これらのヒントの説明については、「テーブル ヒント (Transact-SQL)」を参照してください。For a description of these hints, see Table Hints (Transact-SQL).

INDEX、FORCESCAN、および FORCESEEK 以外のテーブル ヒントは、クエリで既に WITH 句を使用してテーブル ヒントが指定されていない限り、クエリ ヒントとして使用できません。Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. 詳細については、「解説」を参照してください。For more information, see Remarks.

注意事項

パラメーターを使用して FORCESEEK を指定すると、オプティマイザーで考慮できるプラン数の制限は、パラメーターなしで FORCESEEK を指定した場合よりも多くなります。Specifying FORCESEEK with parameters limits the number of plans that can be considered by the optimizer more than when specifying FORCESEEK without parameters. これにより、"プランを生成できない" というエラーが生じる回数が増加する可能性があります。This may cause a "Plan cannot be generated" error to occur in more cases. 将来のリリースでは、オプティマイザーに対して内部変更を行うため、より多くのプランを考慮できるようになります。In a future release, internal modifications to the optimizer may allow more plans to be considered.

RemarksRemarks

ステートメント内部で SELECT 句が使用されている場合を除き、クエリ ヒントは INSERT ステートメントでは指定できません。Query hints can't be specified in an INSERT statement, except when a SELECT clause is used inside the statement.

クエリ ヒントはサブクエリではなく、最上位レベルのクエリでのみ指定できます。Query hints can be specified only in the top-level query, not in subqueries. テーブル ヒントがクエリ ヒントとして指定されている場合、ヒントは最上位レベルのクエリまたはサブクエリで指定できます。When a table hint is specified as a query hint, the hint can be specified in the top-level query or in a subquery. ただし、TABLE HINT 句の exposed_object_name に指定された値は、クエリまたはサブクエリの公開名と完全に一致する必要があります。However, the value specified for exposed_object_name in the TABLE HINT clause must match exactly the exposed name in the query or subquery.

クエリ ヒントとしてのテーブル ヒントの指定Specifying Table Hints as Query Hints

プラン ガイドのコンテキスト内でのみ、INDEX、FORCESCAN、または FORCESEEK テーブル ヒントをクエリ ヒントとして使用することをお勧めします。We recommend using the INDEX, FORCESCAN, or FORCESEEK table hint as a query hint only in the context of a plan guide. プラン ガイドは、たとえばクエリがサードパーティ アプリケーションである場合のように、元のクエリに変更を加えることができない場合に便利です。Plan guides are useful when you can't modify the original query, for example, because it's a third-party application. プラン ガイドに指定されたクエリ ヒントは、コンパイルおよび最適化される前にクエリに追加されます。The query hint specified in the plan guide is added to the query before it's compiled and optimized. アドホック クエリの場合は、プラン ガイド ステートメントをテストするときだけ TABLE HINT 句を使用します。For ad-hoc queries, use the TABLE HINT clause only when testing plan guide statements. その他のアドホック クエリに対しては、テーブル ヒント内でのみこれらのヒントを指定することをお勧めします。For all other ad-hoc queries, we recommend specifying these hints only as table hints.

クエリ ヒントとして指定した場合、INDEX、FORCESCAN、および FORCESEEK テーブル ヒントは次のオブジェクトに対して有効です。When specified as a query hint, the INDEX, FORCESCAN, and FORCESEEK table hints are valid for the following objects:

  • テーブルTables
  • ビューViews
  • インデックス付きビューIndexed views
  • 共通テーブル式 (ヒントは、結果セットが共通テーブル式に入力される SELECT ステートメントに指定する必要があります)Common table expressions (the hint must be specified in the SELECT statement whose result set populates the common table expression)
  • 動的管理ビューDynamic management views
  • 名前付きサブクエリNamed subqueries

既存のテーブル ヒントがないクエリのクエリ ヒントとして、INDEX、FORCESCAN、および FORCESEEK のテーブル ヒントを指定できます。You can specify INDEX, FORCESCAN, and FORCESEEK table hints as query hints for a query that doesn't have any existing table hints. また、それらを使用して、クエリ内の既存の INDEX、FORCESCAN、または FORCESEEK ヒントをそれぞれ置き換えることもできます。You can also use them to replace existing INDEX, FORCESCAN, or FORCESEEK hints in the query, respectively.

INDEX、FORCESCAN、および FORCESEEK 以外のテーブル ヒントは、クエリで既に WITH 句を使用してテーブル ヒントが指定されていない限り、クエリ ヒントとして使用できません。Table hints other than INDEX, FORCESCAN, and FORCESEEK are disallowed as query hints unless the query already has a WITH clause specifying the table hint. この場合、一致するヒントもクエリ ヒントとして指定する必要があります。In this case, a matching hint must also be specified as a query hint. OPTION 句で TABLE HINT を使用して、一致するヒントをクエリ ヒントとして指定します。Specify the matching hint as a query hint by using TABLE HINT in the OPTION clause. この指定はクエリのセマンティクスを保持します。This specification preserves the query's semantics. たとえば、クエリにテーブル ヒント NOLOCK が含まれている場合、プラン ガイドの **@hints** パラメーターの OPTION 句にも NOLOCK ヒントが含まれている必要があります。For example, if the query contains the table hint NOLOCK, the OPTION clause in the **@hints** parameter of the plan guide must also contain the NOLOCK hint. 例 K を参照してください。See Example K.

エラー 8072 はいくつかのシナリオで発生します。Error 8072 occurs in a couple of scenarios. 1 つ目は、一致するクエリ ヒントがない OPTION 句で、TABLE HINT を使用して INDEX、FORCESCAN、または FORCESEEK 以外のテーブル ヒントを指定した場合です。One is when you specify a table hint other than INDEX, FORCESCAN, or FORCESEEK by using TABLE HINT in the OPTION clause without a matching query hint. 2 つ目のシナリオはその逆です。The second scenario is the other way around. このエラーは、OPTION 句によってクエリのセマンティクスが変更され、クエリが失敗した可能性があることを示しています。This error indicates the OPTION clause can cause the semantics of the query to change, and the query fails.

使用例Examples

A.A. MERGE JOIN を使用するUsing MERGE JOIN

次の例では、クエリの JOIN 操作を MERGE JOIN によって実行することを指定します。The following example specifies that MERGE JOIN runs the JOIN operation in the query. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT *   
FROM Sales.Customer AS c  
INNER JOIN Sales.CustomerAddress AS ca ON c.CustomerID = ca.CustomerID  
WHERE TerritoryID = 5  
OPTION (MERGE JOIN);  
GO    

B.B. OPTIMIZE FOR を使用するUsing OPTIMIZE FOR

次の例では、クエリ オプティマイザーでのクエリの最適化時に、ローカル変数 'Seattle' に値 @city_name を使用し、統計データを使用してローカル変数 @postal_code の値を決定するように指定しています。The following example instructs the query optimizer to use the value 'Seattle' for local variable @city_name and to use statistical data to determine the value for the local variable @postal_code when optimizing the query. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

DECLARE @city_name nvarchar(30);  
DECLARE @postal_code nvarchar(15);  
SET @city_name = 'Ascheim';  
SET @postal_code = 86171;  
SELECT * FROM Person.Address  
WHERE City = @city_name AND PostalCode = @postal_code  
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );  
GO  

C.C. MAXRECURSION を使用するUsing MAXRECURSION

MAXRECURSION を使用すると、不適切に作成された再帰共通テーブル式による無限ループの発生を防ぐことができます。MAXRECURSION can be used to prevent a poorly formed recursive common table expression from entering into an infinite loop. 次の例では、無限ループを意図的に作成し、MAXRECURSION ヒントを使用して再帰レベルの数を 2 に制限しています。The following example intentionally creates an infinite loop and uses the MAXRECURSION hint to limit the number of recursion levels to two. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

--Creates an infinite loop  
WITH cte (CustomerID, PersonID, StoreID) AS  
(  
    SELECT CustomerID, PersonID, StoreID  
    FROM Sales.Customer  
    WHERE PersonID IS NOT NULL  
  UNION ALL  
    SELECT cte.CustomerID, cte.PersonID, cte.StoreID  
    FROM cte   
    JOIN  Sales.Customer AS e   
        ON cte.PersonID = e.CustomerID  
)  
--Uses MAXRECURSION to limit the recursive levels to 2  
SELECT CustomerID, PersonID, StoreID  
FROM cte  
OPTION (MAXRECURSION 2);  
GO  

コードのエラーが訂正されると、MAXRECURSION は不要になります。After the coding error is corrected, MAXRECURSION is no longer required.

D.D. MERGE UNION を使用するUsing MERGE UNION

次の例では、MERGE UNION クエリ ヒントを使用します。The following example uses the MERGE UNION query hint. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT *  
FROM HumanResources.Employee AS e1  
UNION  
SELECT *  
FROM HumanResources.Employee AS e2  
OPTION (MERGE UNION);  
GO  

E.E. HASH GROUP および FAST を使用するUsing HASH GROUP and FAST

次の例では、HASH GROUP および FAST クエリ ヒントを使用します。The following example uses the HASH GROUP and FAST query hints. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (HASH GROUP, FAST 10);  
GO    

F.F. MAXDOP を使用するUsing MAXDOP

次の例では、MAXDOP クエリ ヒントを使用します。The following example uses the MAXDOP query hint. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (MAXDOP 2);    
GO

G.G. INDEX を使用するUsing INDEX

次の例では、INDEX ヒントを使用します。The following examples use the INDEX hint. 最初の例では、単一のインデックスを指定します。The first example specifies a single index. 2 番目の例では、1 つのテーブル参照に対して複数のインデックスを指定します。The second example specifies multiple indexes for a single table reference. どちらの例においても別名が使用されているテーブルに INDEX ヒントを適用するので、公開されたオブジェクト名と同じ別名を TABLE HINT 句でも指定する必要があります。In both examples, because you apply the INDEX hint on a table that uses an alias, the TABLE HINT clause must also specify the same alias as the exposed object name. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide1',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 2;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';  
GO  
EXEC sp_create_plan_guide   
    @name = N'Guide2',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 2;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';  
GO    

H.H. FORCESEEK を使用するUsing FORCESEEK

次の例では、FORCESEEK テーブル ヒントを使用します。The following example uses the FORCESEEK table hint. 公開されたオブジェクト名と同じ 2 つの部分で構成される名前を TABLE HINT 句でも指定する必要があります。The TABLE HINT clause must also specify the same two-part name as the exposed object name. この名前は、2 つの部分で構成される名前が使用されているテーブルに INDEX ヒントを適用するときに指定します。Specify the name when you apply the INDEX hint on a table that uses a two-part name. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide3',   
    @stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.Title  
              FROM HumanResources.Employee  
              JOIN Person.Contact AS c ON HumanResources.Employee.ContactID = c.ContactID  
              WHERE HumanResources.Employee.ManagerID = 3  
              ORDER BY c.LastName, c.FirstName;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';  
GO    

I.I. 複数のテーブル ヒントを使用するUsing multiple table hints

次の例では、INDEX ヒントと FORCESEEK ヒントをそれぞれ別のテーブルに適用します。The following example applies the INDEX hint to one table and the FORCESEEK hint to another. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide4',   
    @stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 3;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT (e, INDEX( IX_Employee_ManagerID))   
                       , TABLE HINT (c, FORCESEEK))';  
GO  

J.J. TABLE HINT を使用して既存のテーブル ヒントをオーバーライドするUsing TABLE HINT to override an existing table hint

TABLE HINT ヒントの使用例を次に示します。The following example shows how to use the TABLE HINT hint. ヒントを指定せずにヒントを使用すると、クエリの FROM 句で指定した INDEX テーブル ヒントの動作をオーバーライドできます。You can use the hint without specifying a hint to override the INDEX table hint behavior you specify in the FROM clause of the query. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide5',   
    @stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_ManagerID))  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 3;',   
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT(e))';  
GO    

K.K. セマンティックに作用するテーブル ヒントを指定するSpecifying semantics-affecting table hints

次の例では、クエリに 2 つのテーブル ヒントが含まれています。1 つは、セマンティックに作用する NOLOCK で、もう 1 つはセマンティックに作用しない INDEX です。The following example contains two table hints in the query: NOLOCK, which is semantic-affecting, and INDEX, which is non-semantic-affecting. クエリのセマンティックを保持するために、プラン ガイドの OPTIONS 句に NOLOCK ヒントが指定されています。To preserve the semantics of the query, the NOLOCK hint is specified in the OPTIONS clause of the plan guide. NOLOCK ヒントに加えて、INDEX および FORCESEEK ヒントを指定し、ステートメントのコンパイルおよび最適化中にクエリのセマンティックに作用しない INDEX ヒントを置き換えます。Along with the NOLOCK hint, specify the INDEX and FORCESEEK hints and replace the non-semantic-affecting INDEX hint in the query during statement compilation and optimization. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide6',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 3;',  
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';  
GO    

次の例では、クエリのセマンティックを保持し、テーブル ヒントに指定されている以外のインデックスをオプティマイザーが選択できるようにする別の方法を示します。The following example shows an alternative method to preserving the semantics of the query and allowing the optimizer to choose an index other than the index specified in the table hint. OPTIONS 句に NOLOCK ヒントを指定して、オプティマイザーが選択できるようにします。Allow the optimizer to choose by specifying the NOLOCK hint in the OPTIONS clause. これはセマンティックに作用するので、ヒントを指定します。You specify the hint because it's semantic-affecting. 次に、テーブル参照のみを指定し、INDEX ヒントを指定せずに TABLE HINT キーワードを指定します。Then, specify the TABLE HINT keyword with only a table reference and no INDEX hint. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

EXEC sp_create_plan_guide   
    @name = N'Guide7',   
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title  
              FROM HumanResources.Employee AS e   
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))  
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID  
              WHERE e.ManagerID = 2;',  
    @type = N'SQL',  
    @module_or_batch = NULL,   
    @params = NULL,   
    @hints = N'OPTION (TABLE HINT (e, NOLOCK))';  
GO  

L.L. USE HINT の使用Using USE HINT

次の例では、RECOMPILE および USE HINT のクエリ ヒントを使用します。The following example uses the RECOMPILE and USE HINT query hints. この例では、AdventureWorks2012AdventureWorks2012 データベースを使用します。The example uses the AdventureWorks2012AdventureWorks2012 database.

適用対象: Azure SQL データベースAzure SQL DatabaseSQL Server 2016 (13.x)SQL Server 2016 (13.x)Applies to: Azure SQL データベースAzure SQL Database, SQL Server 2016 (13.x)SQL Server 2016 (13.x).

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING')); 
GO  

参照See Also

Hints (Transact-SQL) Hints (Transact-SQL)
sp_create_plan_guide (Transact-SQL) sp_create_plan_guide (Transact-SQL)
sp_control_plan_guide (Transact-SQL)sp_control_plan_guide (Transact-SQL)
トレース フラグ Trace Flags
Transact-SQL 構文表記規則Transact-SQL Syntax Conventions