Azure SQL Database のエラスティック クエリの概要 (プレビュー)
適用対象:Azure SQL データベース
エラスティック クエリ機能 (プレビュー段階) を使用すると、Azure SQL Database 内の複数のデータベースにまたがる Transact-SQL (T-SQL) クエリを実行できます。 データベース間クエリを実行してリモート テーブルにアクセスしたり、Microsoft 製およびサード パーティ製ツール (Excel、Power BI、Tableau など) を接続して複数のデータベースが含まれるデータ層間でクエリを実行したりできます。 この機能を使用すれば、クエリを大規模なデータ層にスケールアウトし、結果をビジネス インテリジェンス (BI) レポートで視覚化することができます。
エラスティック クエリを使用する理由
Azure SQL Database
T-SQL のみで Azure SQL Database 内のデータベースにわたってクエリを実行します。 これにより、リモート データベースの読み取り専用クエリが可能になり、現在の SQL Server のお客様が 3 部および 4 部構成名または SQL Database へのリンク サーバーを使用してアプリケーションを移行できるようになります。
すべてのサービス レベルで使用可能
エラスティック クエリは、Azure SQL Database のすべてのサービス レベルでサポートされます。 下位のサービス レベルのパフォーマンスに関する制限事項については、後述の「プレビューの制限事項」をご覧ください。
リモート データベースにパラメーターをプッシュする
エラスティック クエリでは、SQL パラメーターを実行用にリモート データベースにプッシュ送信できるようになりました。
ストアド プロシージャの実行
sp_execute _remote を使用して、リモート ストアド プロシージャ呼び出しまたはリモート関数を実行します。
柔軟性
エラスティック クエリを使用する外部テーブルで、スキーマまたはテーブル名が異なるリモート テーブルを参照できます。
エラスティック クエリのシナリオ
目的は、複数のデータベースが 1 つの全体的な結果に行を提供するクエリ シナリオを容易に実現することです。 クエリは、ユーザーまたはアプリケーションによって直接、またはデータベースに接続されているツールを使って間接的に構成できます。 これは、レポートを作成する場合、商用 BI またはデータ統合ツールを使用する場合、または変更できないアプリケーションを作成する場合に特に便利です。 エラスティック クエリを使用すると、Excel、Power BI、Tableau、Cognos などのツールの使い慣れた SQL Server 接続機能を使用して、複数のデータベースにまたがるクエリを実行できます。 また、SQL Server Management Studio や Visual Studio によって発行されるクエリ経由でデータベースのコレクション全体に簡単にアクセスでき、Entity Framework やその他の ORM 環境から複数のデータベースにまたがるクエリを容易に実行できます。 図 1 に示すシナリオでは、既存のクラウド アプリケーション ( エラスティック データベース クライアント ライブラリを使用) はスケールアウトされたデータ層を基盤としており、エラスティック クエリを使用して複数のデータベースにまたがるレポートが作成されます。
図 1 スケールアウトされたデータ層で使用されるエラスティック クエリ
エラスティック クエリの顧客シナリオは、次のトポロジによって特徴付けられます。
垂直パーティション分割 - データベース間クエリ (トポロジ 1): データは、データ層内の複数のデータベース間で垂直方向にパーティション分割されます。 通常は、データベースごとに異なるテーブルのセットが存在します。 これは、異なるデータベースではスキーマが異なることを意味します。 たとえば、あるデータベースに在庫に関するすべてのテーブルが含まれていて、別のデータベースには会計に関連するすべてのテーブルが含まれているケースが該当します。 このトポロジを使用する一般的なユース ケースでは、複数のデータベースの複数のテーブルを対象にクエリを実行したりレポートを作成したりする必要があります。
行方向のパーティション分割 - シャーディング (トポロジ 2): データは行方向にパーティション分割され、スケールアウトされたデータ層の全体に行が分散されます。 この方法では、参加しているすべてのデータベースでスキーマが同じになります。 この方法は、"シャーディング" とも呼ばれます。 シャーディングは、(1) エラスティック データベース ツール ライブラリまたは (2) 自己シャーディングを使って実行、管理できます。 エラスティック クエリは、複数のシャードを対象にクエリを実行したりレポートを作成するために使用します。 シャードは、通常は、エラスティック プール内のデータベースです。 データベースが共通のスキーマを共有している限り、エラスティック クエリは、エラスティック プールのすべてのデータベースを一度にクエリするための効率的な方法とみなすことができます。
Note
エラスティック クエリは、大部分の処理 (フィルター処理、集計) を外部ソース側で実行できるレポート シナリオに最も適しています。 リモート データベースから大量のデータが転送される ETL 操作には適していません。 より複雑なクエリが含まれている負荷の高いレポート ワークロードやデータ ウェアハウス シナリオの場合は、Azure Synapse Analytics を使用することも検討してください。
列方向のパーティション分割 – データベース間クエリ
コード作成を開始するには、 データベース間クエリの概要 (列方向のパーティション分割)に関するページを参照してください。
エラスティック クエリを使用すると、SQL Database 内のデータベースにあるデータを SQL Database 内の他のデータベースで利用できるようにすることができます。 これにより、あるデータベースからのクエリで、SQL Database 内の他の任意のリモート データベースにあるテーブルを参照することができます。 まず、各リモート データベースの外部データ ソースを定義します。 外部データ ソースは、リモート データベース上にあるテーブルにアクセスするローカル データベースに定義します。 リモート データベースに変更を加える必要はありません。 スキーマがデータベースごとに異なる一般的な列方向のパーティション分割シナリオでは、エラスティック クエリを使用して、参照データへのアクセスや、データベース間クエリなどの一般的なユース ケースを実装できます。
重要
ALTER ANY EXTERNAL DATA SOURCE
権限を持っている必要があります。 このアクセス許可は、ALTER DATABASE
アクセス許可に含まれています。 基になるデータ ソースを参照するには、ALTER ANY EXTERNAL DATA SOURCE
アクセス許可が必要です。
参照データ: 参照データの管理のためにトポロジが使われます。 次の図では、参照データを含む 2 つのテーブル (T1 と T2) が専用データベースに保持されています。 エラスティック クエリを使用すると、図に示すように、他のデータベースからリモートでテーブル T1 と T2 にアクセスできるようになります。 参照テーブルのサイズが小さい場合や参照テーブルへのリモート クエリに選択的述語が含まれる場合は、トポロジ 1 を使用します。
図 2 列方向のパーティション分割 - エラスティック クエリを使用して参照データを照会する
データベース間クエリ: エラスティック クエリを使用すると、SQL Database で複数のデータベースにまたがるクエリを必要とするユース ケースに対応できます。 図 3 には 4 つの異なるデータベース (CRM、Inventory、HR、Products) が示されています。 これらのデータベースのいずれかで実行されるクエリでは、他のデータベースにもアクセスする必要があります。 エラスティック クエリを使用すると、4 つのデータベースごとにいくつかの単純な DDL ステートメントを実行することで、このケースに対応するデータベースを構成できます。 この 1 回限りの構成を行った後は、T-SQL クエリまたは BI ツールからローカル テーブルを参照するだけでリモート テーブルにアクセスできます。 リモート クエリで大きな結果が返されない場合は、この方法をお勧めします。
図 3 列方向のパーティション分割 - エラスティック クエリを使用して複数のデータベースにまたがって照会する
次の手順では、SQL Database 内の同じスキーマを持つリモート データベース上にあるテーブルへのアクセスを必要とする列方向のパーティション分割シナリオ向けに、エラスティック データベース クエリを構成します。
データベース スコープ資格情報を作成する
mycredential
型
RDBMS
の外部データ ソースを作成するmydatasource
外部テーブルを作成する
mytable
DDL ステートメントを実行した後は、ローカル テーブルであるかのようにリモート テーブル mytable
にアクセスできます。 Azure SQL Database により、リモート データベースへの接続が自動的に開かれてリモート データベースで要求が処理され、その結果が返されます。
行方向のパーティション分割 - シャーディング
エラスティック クエリを使用してシャーディングされた (行方向にパーティション分割された) データ層に対してレポート タスクを実行するには、データ層のデータベースを表す エラスティック データベース シャード マップ が必要です。 一般に、このシナリオではシャード マップが 1 つだけ使用され、エラスティック クエリ機能 (ヘッド ノード) を備えた専用のデータベースがレポート クエリのエントリ ポイントとして機能します。 シャード マップにアクセスする必要があるのは、この専用のデータベースのみです。 図 4 に、このトポロジと、エラスティック クエリ データベースおよびシャード マップを使用した構成を示します。 エラスティック データベース クライアント ライブラリの概要とシャード マップの作成方法の詳細については、「 シャード マップの管理」を参照してください。
図 4 行方向のパーティション分割: シャーディングされたデータ層に対してエラスティック クエリを使用する
Note
エラスティック クエリ データベース (ヘッド ノード) は、別のデータベースにするか、シャード マップをホストする同じデータベースにすることができます。 どのような構成を選択する場合でも、そのデータベースのサービス レベルとコンピューティング サイズが、予想されるログイン/クエリ要求の数を処理するのに十分な大きさであることを確認します。
次の手順では、SQL Database 内の (通常は) いくつかのリモート データベース上にある一連のテーブルへのアクセスを必要とする行方向のパーティション分割シナリオ向けに、エラスティック データベース クエリを構成します。
マスター キーの作成
mymasterkey
データベース スコープ資格情報を作成します
mycredential
。エラスティック データベース クライアント ライブラリを使用して、データ層を表す シャード マップ を作成します。
の
SHARD_MAP_MANAGER
型外部データソースmydatasource
を作成します。外部テーブルを作成する
mytable
これらの手順を実行すると、ローカル テーブルであるかのように、水平方向にパーティション分割されたテーブル mytable
にアクセスできます。 Azure SQL Database により、テーブルが物理的に格納されているリモート データベースへの複数の並列接続が自動的に開かれます。さらに、リモート データベースで要求が処理され、その結果が返されます。
行方向のパーティション分割シナリオに必要な手順の詳細については、行方向のパーティション分割のためのエラスティック クエリに関するページをご覧ください。
コーディングを開始するには、「クロスデータベース クエリの概要 (列方向のパーティション分割) (プレビュー)」をご覧ください。
重要
多数のデータベースに対するエラスティック クエリの正常な実行は、クエリの実行中に各データベースを使用できることに大きく依存しています。 いずれかのデータベースが使用できない場合、クエリ全体が失敗します。 数百または数千のデータベースに対するクエリを一度に実行することを計画している場合は、クライアント アプリケーションに再試行ロジックが埋め込まれていることを確認してください。または、エラスティック ジョブを活用して、データベースの小さなサブセットに対してクエリを実行し、各クエリの結果を単一の宛先に統合することを検討してください。
T-SQL クエリの実行
外部データ ソースと外部テーブルを定義すると、通常の SQL Server 接続文字列を使用して、外部テーブルが定義されているデータベースに接続できます。 その後、この記事で後述する制限事項を使用して、その接続の外部テーブルに対して T-SQL ステートメントを実行できます。 T-SQL クエリの詳細と例については、水平方向のパーティション分割 と垂直パーティション分割
ツールの接続性
通常の SQL Server 接続文字列を使用して、アプリケーション、BI、またはデータ統合ツールを、外部テーブルを持つデータベースに接続できます。 使用しているツールのデータ ソースとして SQL Server がサポートされていることを確認してください。 接続されたら、ツールを使用して接続する他の SQL Server データベースと同様に、エラスティック クエリ データベースと外部テーブルを参照します。
重要
エラスティック クエリは、SQL Server 認証を使用して接続する場合にのみサポートされます。
コスト
エラスティック クエリは、Azure SQL Database のコストに含まれます。 リモート データベースがエラスティック クエリ エンドポイントとは異なるデータ センターにあるトポロジはサポートされていますが、リモート データベースからのデータエグレスは、Azure レート
プレビューの制限事項
エラスティック クエリの初回実行は、比較的小さなリソースと Standard および General Purpose サービス レベルの場合で数分かかる場合があります。 これは、エラスティック クエリ機能の読み込みに要する時間です。サービス レベルおよびコンピューティング サイズが上位になるほど、読み込みのパフォーマンスが高くなります。
SSMS または SSDT からの外部データ ソースまたは外部テーブルのスクリプトはまだサポートされていません。
SQL Database のインポート/エクスポートでは、外部データ ソースと外部テーブルはまだサポートされていません。 Import/Export を使用する必要がある場合は、エクスポートの前にこれらのオブジェクトを削除し、インポート後にこれらのオブジェクトを再作成します。
現在、エラスティック クエリでは、外部テーブルへの読み取り専用アクセスだけがサポートされています。 ただし、外部テーブルが定義されているデータベースでは、完全な Transact-SQL 機能を使用できます。 これは、たとえば、
SELECT <column_list> INTO <local_table>
を使用して一時的な結果を保持したり、外部テーブルを参照するエラスティック クエリ データベースにストアド プロシージャを定義したりするのに役立ちます。nvarchar(max)を除き、LOB 型 (空間型を含む) は外部テーブル定義ではサポートされていません。 回避策として、LOB 型を nvarchar(max)
にキャストし、ベース テーブルではなくビューに対して外部テーブルを定義し、クエリの元の LOB 型にキャストし直すビューをリモート データベースに作成できます。 nvarchar(max) データ型の列は、結果セットにおいて、エラスティック クエリの実装で使用される高度なバッチ処理手法を無効にし、クエリのパフォーマンスに多大な影響を与える可能性があります。特に、大量の非集約データが結果として転送されるような非標準的なユースケースでは、パフォーマンスが1桁、あるいは2桁分低下する可能性があります。
外部テーブルに対する列の統計情報は、現在サポートされていません。 テーブルの統計はサポートされていますが、手動で作成する必要があります。
Azure SQL Database の外部テーブルでは、カーソルはサポートされていません。
エラスティック クエリは Azure SQL Database でのみ機能します。 SQL Server インスタンスのクエリには使用できません。
プライベート リンクは、現在、外部データ ソースのターゲットであるデータベースのエラスティック クエリではサポートされていません。
関連コンテンツ
- クロスデータベースクエリを始めよう (垂直パーティショニング) (プレビュー)
- スキーマが異なるクラウド データベース間でクエリを実行する (プレビュー)
- スケールアウトされたクラウドデータベース全体にわたるレポート(プレビュー)
- スケールアウトされたクラウド データベース間のレポート (プレビュー)
- sp_execute_remote (Azure SQL Database)