翻訳者ノート
こんにちは!コンテンツチームの古川です。
会社で複数のSQL Serverやデータベースを横断してクエリを実行しようとして、設定の複雑さに手が止まった経験はありませんか?この記事では、リンクサーバーやOPENQUERY、PolyBaseなど5つの代表的な手法を、実際の設定コードとあわせて解説しています。自社の環境に合った方法を選ぶ際の判断材料としてお役立てください。 |
拠点や部門ごとに異なるサーバー、異なるデータベースを使っていて、必要なデータを集めるだけでひと苦労――そんな経験はないでしょうか。
分散したデータベースに格納されたデータへ的確にアクセスし分析することは、意思決定やデータ分析、レポート作成の精度を左右する重要なポイントです。
本記事では、複数サーバーにまたがるSQLクエリを実行するための代表的な方法を、それぞれのステップバイステップの手順とともに解説します。
サーバー間でのSQLクエリ実行への理解を深めれば、データ管理の実践を最適化し、分散データベース環境から価値あるインサイトを引き出せるようになるでしょう。
複数サーバーでSQLクエリを実行するには?5つの方法を解説
異なるサーバー間でSQLクエリを実行するには、いくつかの代表的な方法があります。ツールによって利点や適したユースケースが異なるため、状況に応じた使い分けがポイントです。
ここでは、マルチサーバークエリ実行における代表的なアプローチを見ていきましょう。
1. リンクサーバーの使用
リンクサーバーは、データベース管理システム(DBMS)の機能で、異なるデータベースサーバー間の接続を可能にします。接続するサーバーは、同じタイプ(例:2つのSQL Serverインスタンス)でも、異なるタイプ(例:SQL ServerとOracle)でもかまいません。
リンクサーバーを設定すれば、リモートサーバー上のテーブルやデータを、ローカルオブジェクトであるかのように参照してクエリを実行できます。この機能により分散クエリが可能になり、さまざまなデータソースからのデータを単一のクエリ内で結合・分析できるため、データインテグレーションとレポート作成のプロセスが簡素化されます。
ネットワーク全体に分散したデータへ手軽にアクセス・操作できるのもリンクサーバーの強みで、サーバー間でのデータの手動転送が不要になります。
リンクサーバーの設定
SQL Serverでリンクサーバーを作成・管理するには、いくつかの手順が必要です。以下にステップバイステップのガイドを示します:
SQL Server Management Studio (SSMS) を開く:
「Server Objects」に移動:
「Linked Servers」を右クリックして「New Linked Server...」を選択:
リンクサーバーの詳細を入力:
セキュリティオプションの設定:
サーバーオプションの設定:
接続のテスト:
「OK」をクリックしてリンクサーバーを作成:
リンクサーバーのプロパティを管理:
リンクサーバー上のオブジェクトにアクセス:

リンクサーバーを構成すると、以下のようなJOINを実行できます:
SELECT * FROM [LinkedServerName].[RemoteDatabaseName].[dbo].[RemoteTable] AS R JOIN [LocalTableName] AS L ON R.CommonColumn = L.CommonColumn;
SQL Serverがネイティブにサポートしていない数百のデータソースへのリンクサーバーを設定したい場合は、Connect AIを使用した外部データソースへのリンクサーバーの作成に関する記事をご覧ください。
kintoneのような国産SaaSをリンクサーバー経由でSQL Serverと連携したい場合は、kintoneへのリンクサーバー接続の設定例も参考になります。
2. PolyBaseの使用
PolyBaseは、SQL Serverに統合された強力な技術で、外部のデータソースに格納されたデータを直接クエリ・分析できます。
外部のSQL Server、Teradata、Oracle、HadoopインスタンスなどをローカルのSQLデータベースと同じようにクエリでき、ローカルデータベースと外部データベース間でJOINを実行できるのが特長です。
PolyBaseは外部データベースと直接通信するため、外部データベース側のデータは元の形式・場所のまま保持されます。外部データソースを含むクエリがSQL Serverに送信されると、PolyBaseのクエリオプティマイザーがそのクエリを分析し、最適化された実行プランを生成します。
その後、外部のデータソースとSQL Serverの間で必要なデータのみを移動させることで、ネットワークオーバーヘッドを最小限に抑えつつデータ転送を最適化します。
PolyBaseは多用途性とスケーラビリティを兼ね備えています。慣れ親しんだSQL Server環境を活かしながら、多様なデータソースからインサイトを引き出したい組織にとって、価値あるツールと言えるでしょう。SalesforceのようなSaaSデータを外部データソースとしてSQL Serverから扱いたい場合は、Salesforce Connectでの外部DB連携の手順も参考になるでしょう。
PolyBaseの設定とクエリの実行
PolyBaseのインストールを確認: SQL ServerインスタンスにPolyBase機能がインストールされ構成されていることを確認します。SQL Server のインストール時、または SQL Server 構成マネージャーで機能セットを変更することで確認できます。
外部データソースの構成: SQL Server Management Studio(SSMS)または Transact-SQL(T-SQL)を使用して、Hadoop や Azure Blob Storage など、クエリ対象の外部システムを指す外部データソースを作成します。例:
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (LOCATION = 'hdfs://', CREDENTIAL = HadoopCredentials);
外部テーブルの定義: 外部ソースのデータにマッピングする外部テーブルをSQL Serverに作成します。このステップでは、外部データのスキーマとメタデータを定義します。例:
CREATE EXTERNAL TABLE dbo.MyExternalTable
(
Column1 INT,
Column2 VARCHAR(50)
)
WITH
(
LOCATION = '/path/to/external/data',
DATA_SOURCE = MyHadoopCluster
);
資格情報の設定: セキュリティで保護された外部データソースにアクセスする場合、認証用の資格情報を作成・設定します。例:
CREATE DATABASE SCOPED CREDENTIAL HadoopCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
クエリの記述: SQL Server 上で定義した外部テーブルと、クエリ対象のネイティブ SQL Server テーブルを組み合わせた T-SQL クエリを作成します。例:
SELECT * FROM dbo.NativeTable nt
INNER JOIN dbo.MyExternalTable et ON nt.CommonColumn = et.CommonColumn;
クエリの実行: SSMS またはその他の SQL クライアントを使用して、SQL Server に対して PolyBase クエリを実行します。SQL Server インスタンスに外部データソースへのアクセスとクエリ実行に必要な権限があることを確認してください。
3. OPENQUERYの使用
OPENQUERYは、リンクサーバー上でパススルークエリを実行するためのSQL Serverクエリ関数です。
リモートのデータベースサーバーへクエリを送信し、結果をローカルのSQL Serverインスタンスへ直接取得できます。ローカルサーバーではサポートされていないものの、リンクサーバー側では利用できる関数や機能を使ったクエリを実行したい場合に、特に威力を発揮します。
例えば、2億行のテーブルと5,000万行のテーブルをリンクサーバー経由で単純にJOINすると、SQL Serverは絞り込み条件を適用する前にリモート側の全行をいったんローカルに転送しようとするため、ネットワーク帯域を圧迫し、ソーステーブルへのロックが長時間発生することがあります。OPENQUERYを使えば、JOINやWHERE句によるフィルタリングをリモートサーバー側でパススルー実行させ、絞り込み後の結果セット(例えば数十万行程度)だけをローカルに返せるため、こうした問題を回避しやすくなります。
まず、リモートSQL Serverインスタンスへのリンクサーバーを定義します:
EXEC sp_addlinkedserver 'RemoteServer', 'SQL Server';
ここで、"RemoteServer" は作成するリンクサーバーの名前、"SQL Server" はリンク先のサーバータイプを指定しています。
次に、OPENQUERY を使用してリンクサーバーに対して SELECT クエリを実行します。
SELECT * FROM OPENQUERY(RemoteServer, 'SELECT * FROM RemoteDatabase.dbo.RemoteTable');
OPENQUERYの注意点
OPENQUERYを実行するには、事前に「アドホック分散クエリ」オプションを有効にしておく必要があります(sp_configureで「Show Advanced Options」と「Ad Hoc Distributed Queries」を有効化)。既定では無効になっているため、初回実行時にエラーが出た場合はまずこの設定を確認してください。
また、ストアドプロシージャをOPENQUERY経由で呼び出す場合、SQL Serverは内部でsys.sp_describe_first_result_setを使って結果セットのメタデータを取得しようとします。ストアドプロシージャがローカル一時テーブル(#temp)を使用していると、このメタデータ取得に失敗してエラーになることがあります。その場合は、呼び出し側でEXEC ストアド名 WITH RESULT SETS (...)を使い、返される列と型を明示的に宣言することで回避できます。
OPENQUERYの考え方は、CData Connect AIで作成したリンクサーバーに対しても同様に活用できます。前述のとおりConnect AI経由でSalesforceやkintoneのようなSaaSをリンクサーバーとして登録しておけば、SaaS側にフィルタリングを実行させたうえで必要な結果だけをOPENQUERYで取得でき、400種類以上のデータソースに対して同じ構文をそのまま使い回せます。
なお、OLE DBプロバイダーが対応していれば、OPENQUERYはSELECTだけでなくINSERT・UPDATE・DELETE文のターゲットとしても使用できます。詳細な条件はMicrosoft Learnの公式リファレンスを参照してください。
4. OPENROWSETの使用
OPENROWSETは、SQL Serverの関数で、OLE DBデータソースに対してアドホッククエリを実行できます。リンクサーバーを作成しなくても、外部のデータソースへ直接アクセスしてクエリを実行できるのが特長です。
OPENQUERYとの主な違いは処理の順序にあります。
OPENROWSETはリモートサーバーからデータを取得したうえでローカル側でクエリを実行するのに対し、OPENQUERYはリモートサーバー自体にクエリを実行させます。
OPENROWSET の構文は次のとおりです。
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=RemoteServer;Database=RemoteDatabase;Trusted_Connection=yes;', 'SELECT * FROM dbo.RemoteTable')
この例では、"SQLNCLI" は使用する OLE DB プロバイダー、"RemoteServer" は接続先のリモート SQL Server インスタンス、"RemoteDatabase" は接続先のリモートデータベースを表しています。
5. SQL Serverレプリケーションの使用
SQL Serverレプリケーションは、複数のSQL Serverインスタンス間でデータをレプリケートできるデータ分配・同期技術です。
一つのサーバー(パブリッシャー)から一つ以上の宛先サーバー(サブスクライバー)へデータをレプリケートすることで、複数サーバーにわたるデータのクエリに利用できます。
データがレプリケートされたあとは、各サブスクライバーサーバー上でローカルにクエリでき、分散クエリが実現します。自動レプリケーションを活用して、パブリッシャー上のデータの変更をニアリアルタイムでサブスクライバーサーバーに伝播できます。
Dynamics 365などの外部SaaSデータをノーコードでSQL Serverに取り込みたい場合は、Dynamics 365のSQL Server連携にCData Syncを使う方法も参考になります。
SQL Serverレプリケーションのセットアップ
SQL Server レプリケーションを使用してサーバー間のデータをクエリするには、以下の手順を実行します(具体的な手順は使用するレプリケーションツールによって異なります)。
レプリケーションのセットアップ:パブリッシャーサーバーでパブリケーションを定義し、サブスクライバーサーバーでサブスクリプションを定義して、SQL Server レプリケーションを設定します。
データのレプリケート: パブリッシャーからサブスクライバーサーバーに目的のテーブルやデータベースをレプリケートします。
レプリケートされたデータのクエリ: レプリケーションのセットアップと同期が完了すれば、各サブスクライバーサーバー上で標準的な SQL クエリを使用してレプリケートされたデータをローカルにクエリできます。これにより、リンクサーバーなどの複雑な構成を必要とせずに、複数のサーバーにまたがる分散クエリを実行できます。
CData Connect AIとは?データ仮想化の仕組み
データ仮想化は論理的なデータレイヤーを構築し、複数のデータソースへ一度にアクセスできる、単一の統合ハブを提供します。
これにより、複数のデータソースを組み合わせたクエリも含め、単一のインターフェースから統合データへクエリを実行できます。
CData Connect AIは、データ仮想化を活用して数百のデータソースへの接続を確立します。
アナリティクスやビジネスインテリジェンス、データパイプラインなど、幅広いデータアプリケーションとの連携にも対応しています。
実際に、部門ごとに手動のSQLクエリとバージョン管理のないレポートが乱立し、データの相関関係を追えなくなっていたある教育・官公庁(高等教育機関)の導入事例では、データ仮想化の導入によりわずか1日でシステム全体を統合し、経営陣が部門横断のデータにリアルタイムでアクセスできる体制を実現しています。
ClaudeのようなAIアシスタントから直接SQL Serverのデータを参照したい場合は、ClaudeからSQL Serverに接続する方法も参考になります。
複雑な設定なしで複数データソースを統合する
CData Connect AIは、400種類以上のデータソースをノーコードで単一のSQLインターフェースに統合し、リンクサーバーやPolyBaseのような個別のプロバイダー設定なしでサーバーをまたぐクエリを実現します。プロバイダーのインストールやセキュリティ設定、パフォーマンスチューニングといった運用負荷を大幅に軽減できます。大規模組織向けの認証・アクセス制御にも対応しているため、安心してご利用いただけます。SQL Serverのデータをローコードで活用したアプリ開発も検討したい場合は、QuerierとSQL Serverの連携事例が参考になります。
Connect AIの無料トライアルを今すぐ開始して、複数サーバー間のクエリを数分で体験してください。
複雑な設定なしで複数データソースを統合する
CData Connect AIは、400種類以上のデータソースをノーコードで単一のSQLインターフェースに統合し、リンクサーバーやPolyBaseのような個別のプロバイダー設定なしでサーバーをまたぐクエリを実現します。プロバイダーのインストールやセキュリティ設定、パフォーマンスチューニングといった運用負荷を大幅に軽減できます。大規模組織向けの認証・アクセス制御にも対応しているため、安心してご利用いただけます。
無料トライアルを始める