SQL Gateway: SQL TDS 経由の優れたSQL リンクサーバーでのデータ連携



リンクサーバー(Linked Server)は、Microsoft SQL Server の機能の一つで、ユーザーがSQL Server に保存されたデータと他のリンクサーバーデータソースのデータを統合してクエリを実行することをができます。 これまでODBC インターフェースでのリンクサーバー利用には、OLE DB Provider 経由での構築が一般的でした。 残念なことに、OLE DB 経由のSQL server の接続には、いくつかの難点があり、ユーザーはよくパフォーマンスやスケーラビリティにおいてフラストレーションを募らせていました。 共通の問題:

  • OLE DB Provider 経由のODBC の遅さ
    ODBC は、クエリにおいて、クライテリアやフィルタ条件が存在していても、それぞれのテーブルにSELECT * を実行する必要があります。
  • OLE DB ODBC シンタックスがスケールしない
    OPENQUERY(上記の回避策)は、すべてのテーブルに複雑なsubselect を必要とします。
  • Server へのインストールおよびセキュリティ
    OLE DB Provider を使用するためには、ODBC Driver がSQL Server のインスタンス上で稼働している必要があります。これは可能性としてSQL Server 本来のクエリロードへの影響、またはスタビリティ・パフォーマンスに影響を与えます。

CData SQL Gateway は、SQL リンクサーバー接続のより優れたツールです。 SQL Gateway では、SQL Server がODBC データソースにアクセスできるTDS リモーティングサービスを、SQL Server と同じマシン、もしくは異なるマシンに構築できます。

本記事では、リンクサーバーの構築にSQL Gateway でのTDS リモーティング構築がなぜ優れているかを説明します。 ここでは、ローカルSQL Server データベースのすべてのorder データと特定のSalesforce アカウントのデータをODBC 経由で扱うJOIN クエリを例にします。

パフォーマンス

OLE DB Provider を使う場合、シンプルなINNER JOIN をクエリすることができます。ただし、このようなリンクサーバーの場合、SQL Server はクエリからのカラムフィルタ、やSearch Criteria を ODBC Driver に受け渡しません。代わりに、SELECT * クエリを割ったします。SQL Server がすべてのデータをリクエストするクエリをODBC に投げ、クライアントサイドでフィルタやクライテリアの 処理がされるため、ODBC データソースのデータ量が大きい場合には深刻なパフォーマンスの問題が発生します。

SELECT LocalOrder.ID, ODBC.Name
FROM CData.dbo.[Order] AS LocalOrder
INNER JOIN [SF_ODBC].[CData].[Salesforce].[Account] AS ODBC 
  ON LocalOrder.AccountID = ODBC.ID
WHERE ODBC.Name = 'Company A';

複雑なクエリ

ODBC から取得するデータを指定するには、OPENQUERY とsubselect を使った複雑なクエリを発行することが可能です。 この方法でパフォーマンスが改善します。が、シンプルなSQL 構文ではなく、複雑なsubselect が必要となります。

SELECT LocalOrder.ID, ODBC.Name
FROM CData.dbo.[Order] AS LocalOrder
INNER JOIN (SELECT * FROM OPENQUERY(SF_ODBC, "SELECT ID, Name FROM Account WHERE Name = 'Company A'")) AS ODBC 
  ON LocalOrder.AccountID = ODBC.ID;

インストールの必要性

OLE DB Provider を使ったリンクサーバーは、ODBC Driver をSQL Server インスタンス上に設定する必要があります。

CData SQL Gateway を使ったTDS リモーティングのメリット

OLE DB Provider と比べ、SQL Gatewayで作成されたODBC データソースのTDS リモーティングに対するリンクサーバーでは、SQL Server はシンプルで使い慣れた JOIN クエリを書くだけで、パフォーマンスを落とさないクエリが可能です。SQL Server はカラムフィルタやSerch Criteria をそのままODBC Driver に受け渡すため、 指定したデータだけをTDS リモーティングが取得して、SQL Server に返すため、クエリのパフォーマンスを落としません。 また、ODBC データソースおよびTDS リモーティングを設定するマシンはSQL Server と同じインスタンスである必要がありません。

SELECT LocalOrder.ID, Linked.Name
FROM CData.dbo.[Order] AS LocalOrder
INNER JOIN [SALESFORCE].[CData Salesforce Source Sys].[Salesforce].[Account] AS Linked 
  ON LocalOrder.AccountID = Linked.ID
WHERE Linked.Name = 'Company A';

SQL Gateway のTDS リモーティングサービスを使うことで、シンプルで使い慣れたクエリを使い、かつパフォーマンスを落としません。 SQL Gateway は、Windows マシンで起動します。 是非、試用版をダウンロードして、ODBC データソースへの双方向連携が可能なTDS リモーティング(もしくはMySQL リモーティング)を構築しましょう。