Azure DocumentDB で世界規模の集計が可能に

執筆者: Aravind Ramachandran (Program Manager, Azure DocumentDB)

このポストは、3 月 14 日に投稿された Planet scale aggregates with Azure DocumentDB の翻訳です。

 

最新のサービス更新により、DocumentDB の SQL 文法が拡張され、集計関数がサポートされるようになりました。集計のサポートは UserVoice サイトで特にご要望の多かった機能です。今回、投票してくださった皆様にこの機能をお届けできるようになったことをたいへん嬉しく思っています。

Azure DocumentDB は、高速かつ予測可能なパフォーマンス、高可用性、柔軟なスケーリング、グローバルな分散、開発の簡素化を実現したフル マネージド NoSQL データベース サービスです。皆様に馴染みのある SQL クエリ機能を多数提供すると共に、JSON データに対する一貫した低レイテンシを実現しています。DocumentDB ならではのこのメリットは、Web、モバイル、ゲーム、IoT などシームレスなスケーリングとグローバル レプリケーションを必要とする多くのアプリケーションに最適です。

DocumentDB は完全にスキーマ フリーであり、データベース エンジン内で直接 JSON データ モデルを処理することで、明示的なスキーマやセカンダリ インデックスの作成を必要としない JSON ドキュメントの自動インデックス作成機能を提供します。SQL を使用した JSON ドキュメントのクエリをサポートしており、DocumentDB クエリは、JavaScript の型システム、式の評価、関数呼び出しを基盤としています。これにより、リレーションの予測、JSON ドキュメント間の階層移動、自己結合、空間クエリ、JavaScript のみで記述されたユーザー定義関数 (UDF) の呼び出しに対応する自然なプログラミング モデルを提供します。今回これらの機能に加えて、SQL 文法の拡張により、新たに集計関数がサポートされるようになりました。

graphic

世界規模のアプリケーションに対応する集計処理

ゲームのクリアに関する統計情報を計算する必要のあるモバイル ゲームを開発している場合や、特定のイベントの発生回数に基づいてアクションをトリガーする IoT プラットフォームを設計している場合、あるいはシンプルな Web サイトやページ分割する API を作成する場合には、いずれも運用データベースに対して集計クエリを実行する必要があります。今回の更新により、DocumentDB ではあらゆる規模のデータに対して低レイテンシおよび予測可能なパフォーマンスで集計クエリを実行できるようになりました。

集計のサポートは、すべての DocumentDB の運用データセンターにロールアウトされています。既存の DocumentDB アカウントに対して集計クエリを実行していただけます。また、SDK、REST API、Azure ポータルを使用して新しい DocumentDB アカウントをプロビジョニングすることも可能です。ただし、複数のパーティションに対して集計クエリを実行する場合や、.NET で LINQ 集計演算子を使用する場合は、最新バージョンの SDK をダウンロードして使用する必要があります。

SQL による集計

DocumentDB では、SQL 集計関数の COUNT、MIN、MAX、SUM、AVG がサポートされます。これらの演算子の動作はリレーショナル データベースの場合と同様で、クエリに一致するドキュメントに対して計算された値を返します。たとえば、以下のクエリは、DocumentDB からデバイス xbox-1001 の測定値の個数を取得します。

 SELECT VALUE COUNT(1)
FROM telemetry T
WHERE T.deviceId = "xbox-1001"

VALUE キーワードについて簡単にご説明すると、すべてのクエリは JSON フラグメントを返します。VALUE を使用すると、JSON ドキュメント (例: {"$1": 100}) ではなく、COUNT のスカラー値 (例: 100) を取得できます。

集計のサポートは、既存のクエリ文法や機能と連携するようにシームレスに拡張されました。たとえば、以下のクエリは、建物の位置を表す特定のポリゴン境界内に含まれるすべてのデバイスで測定された気温の平均値を返します (集計と地理空間近接検索の組み合わせ)。

 SELECT VALUE AVG(T.temperature?? 0)
FROM telemetry T
WHERE ST_WITHIN(T.location, {"type": "polygon": … })

柔軟な拡張が可能な NoSQL データベースである DocumentDB では、任意のストレージやスループットのデータを格納しクエリを実行できます。コレクション内のパーティションのサイズや数を問わず、簡単な SQL クエリを送信するだけで、DocumentDB がデータ パーティション間でのクエリのルーティングを処理して、一致する各パーティション内のローカル インデックスに対してクエリを並列実行し、中間結果をマージして最終的な集計値を返します。そのため、DocumentDB を使用して低レイテンシの集計クエリを実行できます。

.NET SDK では、以下のように CreateDocumentQuery<T> メソッド (英語) を使用します。

 client.CreateDocumentQuery<int>(
"/dbs/devicedb/colls/telemetry",
"SELECT VALUE COUNT(1) FROM telemetry T WHERE T.deviceId  = 'xbox-1001'",
new FeedOptions { MaxDegreeOfParallelism = -1 });

詳細な使用例については、Github のクエリ サンプル (英語) をご覧ください。

LINQ による集計

.NET SDK 1.13.0 (英語) では、SQL 以外に LINQ を使用して集計クエリを実行することもできます。最新の SDK では、Count、Sum、Min、Max、Average と、それらの非同期版の CountAsync、SumAsync、MinAsync、MaxAsync、AverageAsync の各演算子がサポートされています。たとえば前述のクエリの場合、以下の LINQ クエリとして記述できます。

 client.CreateDocumentQuery<DeviceReading>("/dbs/devicedb/colls/telemetry",
new FeedOptions { MaxDegreeOfParallelism = -1 })
.Where(r => r.DeviceId == "xbox-1001")
.CountAsync();

集計クエリ中に非同期の改ページ処理が実行されるしくみなど、DocumentDB における LINQ のサポートの詳細については、こちらのドキュメントをご覧ください。

Azure ポータルを使用した集計

Azure ポータルでも、集計クエリをすぐに実行できます。

screenshot

次のステップ

今回のブログ記事では、Azure DocumentDB の集計関数およびクエリのサポートについて説明しました。クエリの利用を開始するには、Azure ポータルから DocumentDB アカウントを新規作成してください。

Twitter アカウント (@DocumentDB) では、DocumentDB の最新情報や新機能をご紹介しています。ぜひフォローしてください。ご不明な点がありましたら、Stack Overflow の開発者フォーラム (英語) までお問い合わせください。