分散クエリ アーキテクチャ

MicrosoftSQL Server は、Transact-SQL ステートメント内で異種 OLE DB データ ソースを参照する方法として、次の 2 つをサポートしています。

  • リンク サーバー名

    システム ストアド プロシージャ sp_addlinkedserversp_addlinkedsrvlogin を使用して、OLE DB データ ソースにサーバー名を渡します。リンク サーバー内のオブジェクトは、4 部構成の名前を使用して Transact-SQL ステートメント内で参照できます。たとえば、DeptSQLSrvr というリンク サーバー名が SQL Server の別のインスタンスで定義されている場合、次のステートメントはこのサーバー上のテーブルを参照します。

    SELECT JobTitle, HireDate 
       FROM DeptSQLSrvr.AdventureWorks2008R2.HumanResources.Employee;
    

    リンク サーバー名を OPENQUERY ステートメントで指定して、OLE DB データ ソースの行セットを開くこともできます。この行セットは、Transact-SQL ステートメント内でテーブルと同じように参照できます。

  • アドホック コネクタ名

    データ ソースを頻繁に参照しない場合は、リンク サーバーに接続するために必要な情報を指定して OPENROWSET 関数または OPENDATASOURCE 関数を指定します。これにより、行セットは Transact-SQL ステートメント内でテーブルと同じように参照できます。

    SELECT *
    FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
            'c:\MSOffice\Access\Samples\Northwind.mdb';'Admin';'';
            Employees);
    

SQL Server では、OLE DB を使用してリレーショナル エンジンとストレージ エンジンの間の通信を行います。リレーショナル エンジンは、各 Transact-SQL ステートメントを一連の操作に分割します。それぞれの操作は、ストレージ エンジンがベース テーブルから開いた単純な OLE DB 行セットに対する操作です。これは、リレーショナル エンジンは、OLE DB データ ソースに対する単純な OLE DB 行セットも開くことができることを意味しています。

リレーショナル エンジン、OLE DB 階層、ストレージ エンジン

リレーショナル エンジンは OLE DB API (アプリケーション プログラミング インターフェイス) を使用して、リンク サーバー上の行セットを開き、行をフェッチし、トランザクションを管理します。

OLE DB データ ソースにリンク サーバーとしてアクセスするには、SQL Server が動作するサーバー上に OLE DB プロバイダーが存在している必要があります。OLE DB データ ソースに対して使用できる Transact-SQL 操作の数は、OLE DB プロバイダーの機能によって決まります。詳細については、「分散クエリの OLE DB プロバイダ参照」を参照してください。

たとえば、sysadmin 固定サーバー ロールのメンバーは、SQL Server のインスタンスごとに SQL ServerDisallowAdhocAccess プロパティを使用して、OLE DB プロバイダーのアドホック コネクタ名の使用を有効化または無効化できます。アドホック アクセスが有効化されると、そのインスタンスにログオンしているユーザーは、アドホック コネクタ名を含んだ SQL ステートメントを実行し、OLE DB プロバイダーを使用してアクセスできるネットワークのすべてのデータ ソースを参照できます。sysadmin ロールのメンバーは、データ ソースへのアクセスを制御するために、その OLE DB プロバイダーに対するアドホック アクセスを無効化できます。その結果、ユーザーは管理者が定義したリンク サーバー名で参照されるデータ ソースのみに制限されます。既定では、SQL Server OLE DB プロバイダーではアドホック アクセスが有効化されており、他のすべての OLE DB プロバイダーでは無効化されています。

分散クエリを使用すると、SQL Server サービスを実行している Microsoft Windows アカウントのセキュリティ コンテキストを使用して、他のデータ ソース (たとえば、ファイルや Active Directory などのリレーショナルでないデータ ソース) にアクセスできます。SQL Server は Windows ログインでは正常にログインを借用できますが、SQL Server ログインでは借用できません。この場合、SQL Server サービスを実行しているアカウントに権限があり、分散クエリ ユーザーには権限のない他のデータ ソースに、分散クエリ ユーザーからのアクセスを許してしまう可能性が生じます。対応するリンク サーバーにアクセスする権限のある特定のログインを定義するには、sp_addlinkedsrvlogin を使用します。このような制御は、アドホック名では使用できないので、OLE DB プロバイダーでアドホック アクセスを有効にする場合は十分に注意してください。

可能な場合はいつでも、SQL Server はデータ ソースに対して、結合、条件、射影、並べ替え、および GROUP BY (SQL 言語) 操作などのリレーショナル操作を試行します。特に指定しない限り、SQL Server 自身がベース テーブルをスキャンして SQL Server に読み込んだり、リレーショナル操作を実行することはありません。SQL Server は OLE DB プロバイダーに問い合わせ、そのプロバイダーがサポートする SQL 文法のレベルを判別し、その情報に基づいて、可能な限り多くのリレーショナル操作をプロバイダーに送ります。詳細については、「OLE DB プロバイダの SQL 言語構文の要件」を参照してください。

SQL Server では、OLE DB プロバイダーのメカニズムを指定して、OLE DB データ ソース内でのキー値の分布状況を示す統計を返すようにします。これにより、各 SQL ステートメントの必要条件に対して、SQL Server クエリ オプティマイザーがデータ ソース内のデータのパターンをより正確に分析できるようになり、最適な実行プランを作成するクエリ オプティマイザーの機能が向上します。詳細については、「OLE DB プロバイダーを使用するための分布統計情報の要件」を参照してください。