分散クエリの最適化

SQL Server では、パフォーマンスを向上するために、次の種類の分散クエリ固有の最適化が実行されます。

  • OLE DB SQL コマンド プロバイダを使用したリモート クエリの実行。

    OLE DB プロバイダが次の最低要件を満たす場合、OLE DB プロバイダは SQL コマンド プロバイダであると見なされます。

    • Command オブジェクトとその必須インターフェイスをすべてサポートする。

    • DBPROPVAL SQL SUBMINIMUM 構文、つまり Entry レベル以上の ISO または Core レベル以上の ODBC をサポートする。プロバイダは、この言語仕様レベルを DBPROP_SQLSUPPORT OLE DB プロパティを使用して公開する必要があります。

  • OLE DB インデックス プロバイダを使用したインデックス アクセス。

    OLE DB プロバイダが次の最低要件を満たす場合、OLE DB プロバイダはインデックス プロバイダであると見なされます。

    • TABLES、COLUMNS、および INDEXES スキーマ行セットを伴う IDBSchemaRowset インターフェイスをサポートする。

    • インデックス名と対応するベース テーブル名を指定することにより、IOpenRowset を使用してインデックス上で行セットを開くことをサポートする。

    • Index オブジェクトは、IRowsetIRowsetIndexIAccessorIColumnsInfoIRowsetInfo、および IConvertTypes のすべての必須インターフェイスをサポートする。

    • IOpenRowset を使用してインデックス ベース テーブルに対して開いた行セットが、IRowsetLocate インターフェイスをサポートし、インデックスから取得したブックマークではなく、行ベースの配置を行う。

リモート クエリの実行

SQL Server は、可能な限り分散クエリの評価を SQL コマンド プロバイダへ委任します。プロバイダのデータ ソースに格納されているリモート テーブルだけにアクセスする SQL クエリは、元の分散クエリから展開され、プロバイダに対して実行されます。この動作により、プロバイダから返される行数が減少し、プロバイダはそのインデックスを使用してクエリを評価できます。

元の分散クエリをどの程度 SQL コマンド プロバイダに委任できるかは、次の要因が影響します。

  • SQL コマンド プロバイダがサポートする言語仕様レベル

  • 照合順序の互換性

SQL コマンド プロバイダがサポートする言語仕様レベル

SQL Server は、特定の言語仕様レベルでサポートされる操作だけを委任します。言語仕様レベルを最も高いものから最も低いものまで並べると、SQL Server、Entry レベルの ISO、ODBC Core、Jet の順になります。言語仕様レベルが高くなるほど、SQL Server はより多くの操作をプロバイダに委任できます。

注意

SQL Server の言語仕様レベルは、プロバイダが SQL Server リンク サーバーに対応する場合に使用されます。

各言語仕様レベルは、下位レベルのスーパーセットです。したがって、特定のレベルに操作が委任されると、そのレベル以上のすべてのレベルにも操作が委任されます。

bit データ型および uniqueidentifer データ型に関係するクエリは、プロバイダに委任されず、常にローカルに評価されます。

SET オプションの CONCAT_NULL_YIELDS_NULL が OFF になっている場合、文字列の連結は常にローカルに行われます。

次の操作と構文要素は、指定の言語仕様レベル、およびそれ以上のすべてのレベルに委任されます。

  • SQL Server : 外部結合、CUBE、ROLLUP、剰余演算子 (%)、ビットごとの演算子、文字列関数、算術システム関数。

  • ISO Entry レベル : UNION、UNION ALL。

  • ODBC Core : DISTINCT を伴う集計関数、文字列定数。

  • Jet : DISTINCT を伴わない集計関数、並べ替え (ORDER BY)、内部結合、述語、サブクエリ演算子 (EXISTS、ALL、SOME、IN)、DISTINCT、上位レベルに指定されていない算術演算子、上位レベルに指定されていない定数、すべての論理操作。

    たとえば、CUBE、ROLLUP、外部結合、剰余演算子 (%)、ビットごとの演算子、文字列関数、および算術システム関数を除くすべての操作は、SQL Server ではなく ISO Entry レベルのプロバイダに委任されます。

照合順序の互換性

分散クエリの場合、すべての文字データの比較セマンティクスは、SQL Server のローカル インスタンスの文字セットと並べ替え順で定義されます。SQL Server では、複数の照合順序がサポートされます。列ごとに異なる照合順序を設定できます。また、各文字値には関連する照合順序プロパティがあります。SQL Server は、リモート データ ソースからの文字データの照合順序プロパティを解釈し、それに応じて文字データを処理します。リモート列の照合順序の詳細については、「分散クエリの照合順序」を参照してください。

SQL Server では、次の状態が確認できる場合のみ、文字型列における比較および ORDER BY 操作をプロバイダに委任できます。

  • 基になるデータ ソースがその列の照合順序と文字セットを使用している。

  • 文字比較セマンティクスが ISO および SQL Server の標準に従っている。

分散クエリの照合順序」では、SQL Server で列ごとの照合順序を判断する方法をまとめています。リモート データ ソースが照合順序をサポートする場合は、プロバイダには照合順序の互換性があると見なされます。

その他の SQL サポート上の注意事項

次の SQL 構文要素は、SQL 言語仕様レベルでは指定されていません。

  • 入れ子になったクエリのサポート

    プロバイダが入れ子になったクエリ (サブクエリ) をサポートする場合は、SQL Server はプロバイダにこの操作を委任できます。入れ子になったクエリのサポートは OLE DB プロパティで自動的に判断できません。このため、システム管理者は NestedQueries プロバイダ オプションを設定することにより、SQL Server に対してプロバイダが入れ子になったクエリをサポートすることを示します。

  • パラメータ マーカーのサポート

    プロバイダがクエリの中で ? パラメータ マーカーを使用してパラメータ化クエリの実行をサポートする場合は、SQL Server はプロバイダにこの操作を委任できます。パラメータ マーカーのサポートは OLE DB プロパティで自動的に判断できません。このため、システム管理者は DynamicParameters プロバイダ オプションを設定することにより、SQL Server に対してプロバイダがパラメータ マーカーをサポートすることを示します。

  • LIKE のサポート

    プロバイダで SQL Server の構文およびセマンティクスで実装されているとおりに LIKE 演算子がサポートされている場合、SqlServerLike プロバイダ オプションを設定して、プロバイダが LIKE 演算子をサポートすることを示すことができます。

    これらのプロバイダ オプションの設定の詳細については、「分散クエリ用の OLE DB プロバイダの構成」を参照してください。

インデックス アクセス

SQL Server では、インデックス プロバイダのインデックスを使用して述語を評価し、リモート テーブルに対して並べ替え操作を実行するという実行ストラテジを使用できます。プロバイダに対してインデックス アクセスを有効にするには、IndexAsAccessPath プロバイダ オプションを設定します。

さらに、文字型列に関係するインデックスを使用している場合は、対応するリンク サーバーの collation compatible リンク サーバー構成オプションを true に設定します。詳細については、「sp_serveroption (Transact-SQL)」を参照してください。

注意

指定された分散クエリの実行プランを判断するには、SQL Server Management Studio を使用して実行プランをグラフィック表示します。実行プランにリモート クエリ実行が使用されている場合、これは、Remote Query 論理操作および物理操作を使用して表示されます。この操作の引数は、リモートで実行されたクエリを表します。