Azure Synapse SQL アーキテクチャ
この記事では、Synapse SQL アーキテクチャのコンポーネントについて説明します。 また、Azure Synapse SQL で分散クエリ処理機能と Azure Storage を組み合わせて、ハイ パフォーマンスとスケーラビリティを実現する方法についても説明します。
Synapse SQL アーキテクチャのコンポーネント
Synapse SQL では、スケールアウト アーキテクチャを使用して、複数のノードにデータの計算処理を分散します。 コンピューティングをストレージから切り離すことで、システム内のデータとは無関係に、コンピューティングをスケーリングできるようになります。
専用 SQL プールの場合、スケール単位は、Data Warehouse ユニットと呼ばれるコンピューティング能力の抽象化です。
サーバーレスの SQL プールでは、クエリ リソース要件に合わせて自動的にスケーリングされます。 トポロジは、ノードやフェールオーバーの追加または削除によって時間の経過とともに変化するため、変化に対応して、十分なリソースを確保した上でクエリが正常に完了できるようにします。 たとえば、次の図は、4 つのコンピューティング ノードを使用してクエリを実行するサーバーレス SQL プールを示しています。
Synapse SQL は、ノードベースのアーキテクチャを使用します。 アプリケーションでは T-SQL コマンドに接続し、これを Synapse SQL の単一のエントリ ポイントである制御ノードに発行します。
Azure Synapse SQL の制御ノードでは、分散クエリ エンジンを利用して並列処理のためにクエリが最適化された後、作業を並列で実行するために操作がコンピューティング ノードに渡されます。
サーバーレス SQL プールの制御ノードは、分散クエリ処理 (DQP) エンジンを利用して、コンピューティング ノードで実行される小さなクエリにユーザー クエリを分割することにより、ユーザー クエリの分散実行の最適化と調整を行います。 この各小さなクエリはタスクと呼ばれ、分散実行の単位を表します。 タスクでは、ストレージからファイルを読み取り、他のタスクの結果、または他のタスクから取得したグループや注文データを結合します。
コンピューティング ノードはすべてのユーザー データを Azure Storage に保存し、並行クエリを実行します。 Data Movement Service (DMS) はシステム レベルの内部サービスで、必要に応じて複数のノードにデータを移動し、クエリを並列に実行して、正確な結果を返します。
Synapse SQL を使用すると、ストレージとコンピューティングを分離することにより、ストレージのニーズに関係なく、コンピューティング能力を独立してサイジングできるという利点があります。 サーバーレス SQL プールのスケーリングは自動的に行われますが、専用 SQL プールでは次のことが可能です。
- データを移動することなく、専用 SQL プール内でコンピューティング能力を拡大または縮小する。
- データをそのままの状態で保持しながら、コンピューティング能力を一時停止するため、支払いをストレージの分だけにする。
- 稼働時間中にコンピューティング能力を再開する。
Azure Storage
Synapse SQL では、ユーザー データを安全に保持するために Azure Storage を使用します。 データは Azure Storage によって保存および管理されるため、ストレージの使用量が別途課金されます。
サーバーレス SQL プールでは、データ レイク ファイルにクエリを実行できます。専用 SQL プールでは、クエリを実行し、データ レイク ファイルからデータを取り込むことができます。 データを専用 SQL プールに取り込むと、システムのパフォーマンスを最適化するために、データはディストリビューションにシャード化されます。 どのシャーディング パターンを使用して、テーブルを定義するときにデータを分散するかを選択できます。 次のシャーディング パターンがサポートされています。
- ハッシュ インデックス
- ラウンド ロビン
- レプリケート
制御ノード
制御ノードは、アーキテクチャの脳です。 すべてのアプリケーションおよび接続と対話するフロントエンドです。
Synapse SQL では、制御ノードで分散クエリ エンジンが実行され、並列クエリの最適化と調整が行われます。 専用 SQL プールに T-SQL クエリを送信すると、それが制御ノードによって、各ディストリビューションに対して並列で実行されるクエリに変換されます。
サーバーレス SQL プールでは、DQP エンジンが制御ノードで実行され、コンピューティング ノードで実行される小さなクエリにユーザー クエリを分割することにより、ユーザー クエリの分散実行の最適化と調整を行います。 また、ノードごとに処理される一連のファイルも割り当てられます。
コンピューティング ノード
コンピューティング ノードは計算能力を提供します。
専用 SQL プールでは、処理のためにディストリビューションがコンピューティング ノードにマップされます。 プールでは、追加のコンピューティング リソースの料金を支払うと、ディストリビューションが、使用可能なコンピューティング ノードに再マッピングされます。 コンピューティング ノード数の範囲は 1 から 60 で、専用 SQL プールのサービス レベルによって決定されます。 各コンピューティング ノードにはノード ID があり、システム ビューで確認できます。 名前が sys.pdw_nodes で始まるシステム ビューで node_id 列を検索することにより、コンピューティング ノード ID を見ることができます。 これらのシステム ビューの一覧については、Synapse SQL のシステム ビューに関する記事をご覧ください。
サーバーレス SQL プールでは、各コンピューティング ノードに、タスクとタスクを実行する一連のファイルが割り当てられます。 タスクは分散クエリ実行の単位であり、実際には、ユーザーが送信したクエリの一部です。 自動スケーリングは、ユーザー クエリの実行に十分なコンピューティング ノードを利用できるようにするために有効です。
データ移動サービス
Data Movement Service (DMS) は、専用 SQL プールのデータ転送テクノロジであり、コンピューティング ノード間のデータ移動を調整します。 一部のクエリでは、並列クエリで正確な結果が返されるためにデータ移動が必要です。 データ移動が必要な場合は、DMS により、適切なデータが適切な場所に移動する必要があります。
ディストリビューション
ディストリビューションは、専用 SQL プールで分散データに対して実行される並列クエリの保存および処理の基本単位です。 専用 SQL プールでクエリの実行する場合、作業は並列で実行される 60 の小さなクエリに分割されます。
60 の小さいクエリそれぞれは、いずれかのデータ ディストリビューションで実行されます。 各コンピューティング ノードでは、60 ディストリビューションの 1 つまたは複数が管理されます。 最大コンピューティング リソース数を持つ 1 つの専用 SQL プールでは、1 コンピューティング ノードあたりのディストリビューション数は 1 です。 最小コンピューティング リソース数を持つ 1 つの専用 SQL プールでは、1 つのコンピューティング ノードにすべてのディストリビューションがあります。
ハッシュ分散テーブル
ハッシュ分散テーブルでは、大きなテーブルでの結合と集計用に最高のクエリ パフォーマンスを実現できます。
ハッシュ分散テーブルにデータをシャード化するために、専用 SQL プールではハッシュ関数を使用して、各行が 1 つのディストリビューションに確実に割り当てられます。 テーブルの定義では、1 つの列をディストリビューション列として指定します。 ハッシュ関数は、ディストリビューション列の値を使用してディストリビューションに各行を割り当てます。
次の図は、完全な (分散していない) テーブルがハッシュ分散テーブルとして保存されるしくみを示したものです。
- 各行は、1 つのディストリビューションに属しています。
- 確定ハッシュ アルゴリズムが、各行を 1 つのディストリビューションに割り当てます。
- ディストリビューションごとのテーブル行の数は、異なるテーブル サイズによって示されるように異なります。
ディストリビューション列の選択については、差異性、データ スキュー、およびシステムで実行されるクエリの種類など、パフォーマンスに関する考慮事項があります。
ラウンドロビン分散テーブル
ラウンド ロビン テーブルは作成が最も簡単なテーブルで、読み込み用のステージング テーブルとして使用した場合、高速なパフォーマンスを実現します。
ラウンドロビン分散テーブルでは、テーブル間にデータが均等に配布されますが、最適化は行われません。 1 つのディストリビューションがまずランダムに選択されたら、行のバッファーが順次ディストリビューションに割り当てられます。 ラウンド ロビン テーブルではデータは素早く読み込まれますが、通常、ハッシュ分散テーブルの方が高いクエリ パフォーマンスが見込まれます。 ラウンド ロビン テーブルの結合では、データの再シャッフルが必要になり、追加の時間がかかります。
レプリケート テーブル
レプリケート テーブルは、小さなテーブル用に最も高速なクエリ パフォーマンスを実現します。
レプリケートされたテーブルは、各コンピューティング ノードにテーブルの完全なコピーをキャッシュします。 そのため、テーブルをレプリケートすると、結合または集計の前に、コンピューティング ノード内のデータを転送する必要がなくなります。 レプリケート テーブルは小さいテーブルに最適です。 追加のストレージが必要であり、データの書き込み時には追加のオーバーヘッドも発生するため、大規模なテーブルは実用的ではありません。
次の図は、各コンピューティング ノードの最初のディストリビューションにキャッシュされたレプリケート テーブルを示しています。
次のステップ
Synapse SQL の概要については学習したので、次は、すばやく 専用 SQL プールを作成し、サンプル データを読み込む方法について学習してください。 または、サーバーレス SQL プールを使い始めます。 Azure に慣れていない場合に新しい用語を調べるには、Azure 用語集が役立ちます。