具体化されたビューとストアド関数
KQL の基本的なクエリと最適化の手法を理解したので、具体化されたビューとイベントハウスに格納されている関数を調べてみましょう。
具体化されたビューを理解する
具体化されたビューは、KQL データベースの一般的なパフォーマンスの課題を解決する事前計算済みの集計です。 イベントハウス内の KQL データベースには、多くの場合、IoT センサー、アプリケーション ログ、その他のイベントなどのストリーミング データ ソースから数百万行または数十億行が含まれています。 これらの大規模なデータセットで集計クエリを実行すると、リソースの計算にかなりの時間がかかる場合があります。
具体化されたビューでは、事前計算済みの集計結果が格納され、新しいデータが到着すると自動的に更新されます。 マテリアライズド ビューでは、クエリを実行するたびにすべての履歴データからメトリックを再計算する代わりに、結果が保持され、新しいデータのみが処理されて集計が更新されます。 これにより、大規模なデータセットを操作する場合でも、ダッシュボードとレポートの結果がすぐに得られます。
自動更新のしくみ
具体化されたビューは、常に最新の結果を提供するために連携する 2 つの部分で構成されます。
- 具体化された部分: 既に処理されているデータからの事前計算済みの集計結果
- 差分: 最後のバックグラウンド更新以降に到着した新しいデータ
具体化されたビューに対してクエリを実行すると、クエリ時に両方の部分が自動的に結合され、新しい up-to-date 結果が得られます。 つまり、具体化されたビューは、バックグラウンド具体化プロセスが最後に実行された日時に関係なく、常に現在のデータを返します。 一方、バックグラウンド プロセスでは、差分部分からマテリアライズド パーツにデータが定期的に移動され、事前計算された結果が最新の状態に維持されます。 このアプローチでは、事前計算された結果の速度がリアルタイム データの鮮度で提供されます。
具体化されたビューを作成する
具体化されたビューは、新しいデータが到着すると自動的に更新される KQL summarize ステートメントをカプセル化します。 ベンダー別と日別の乗車メトリックを追跡する例を次に示します。
.create materialized-view TripsByVendor on table TaxiTrips
{
TaxiTrips
| summarize trips = count(), avg_fare = avg(fare_amount), total_revenue = sum(fare_amount)
by vendor_id, pickup_date = format_datetime(pickup_datetime, "yyyy-MM-dd")
}
具体化されたビューのクエリ
作成したマテリアライズド ビューは、通常のテーブルと同様にクエリを実行できます。
TripsByVendor
| where pickup_date >= ago(7d)
| project pickup_date, vendor_id, trips, avg_fare, total_revenue
| sort by pickup_date desc, total_revenue desc
ストアド関数について
KQL には、クエリを関数としてカプセル化する機能が含まれているため、一般的なクエリを簡単に繰り返すことができます。 また、関数にパラメーターを指定できるため、変数値を使用して同じクエリを繰り返すことができます。
ストアド関数は、ストリーミング データがあり、複数のユーザーがクエリを作成するイベントハウスで役立ちます。 同じフィルター処理または変換ロジックを繰り返し記述する代わりに、関数として 1 回定義し、さまざまなクエリで再利用できます。 関数は、異なるチーム メンバーが同じロジックをデータに適用する必要がある場合に、計算が一貫して実行されるようにするのにも役立ちます。
関数を作成する
.create-or-alter function trips_by_min_passenger_count(num_passengers:long)
{
TaxiTrips
| where passenger_count >= num_passengers
| project trip_id, pickup_datetime
}
関数を呼び出すには、テーブルと同様に使用します。 この例では、trips_by_min_passenger_count 関数を使用して、3 人以上の乗客が乗車した 10 件の乗車を検索します。
trips_by_min_passenger_count(3)
| take 10