マテリアライズドビューは、SQL サブステートメントをインクリメンタルに事前計算し、中間結果を永続化します。クエリを実行すると、システムは自動的に SQL をリライトして事前計算されたデータを読み取り、ダッシュボードやレポートのクエリレイテンシーを数分から数秒に短縮します。
高速化戦略の選択
Simple Log Service (SLS) はリアルタイムの SQL 分析をサポートしており、各クエリは指定された時間範囲内の全データを処理します。大規模なデータセットの場合、以下の方法でパフォーマンスを向上させることができます。
|
高速化手法 |
原則 |
ユースケース |
制限事項 |
|
計算リソースを増やして、単一クエリの並列性を向上させます。 |
SQL クエリが頻繁に変更される大規模データセット。 |
データ規模には上限があり、超大規模データセットでは実行時間が長くなる可能性があります。 |
|
|
マテリアライズドビュー (本トピック) |
固定 SQL クエリのサブステートメントに対してインクリメンタルな事前計算を実行します。クエリ時に、クエリは自動的にリライトされ、事前計算された結果を読み取ります。 |
SQL クエリが比較的固定されている、大規模データセットのレポートやダッシュボードのシナリオ。 |
標準 Logstore のみがサポートされます。プロジェクトごとに最大 100 のマテリアライズドビューを作成できます。 |
仕組み
-
ソース Logstore:生ログデータを含む Logstore です。マテリアライズドビューはソース Logstore に影響を与えません。
-
マテリアライズドストア:マテリアライズドビューを作成すると、システムは対応するマテリアライズドストアを自動的に作成し、事前計算された結果を保持します。
マテリアライゼーションは、取り込まれたデータをストリームとして処理します。生データが順不同のログ時間で到着した場合でも、スケジュールされたマテリアライゼーションは重複や欠落を生成しません。
-
定期的なバックグラウンド計算:システムは、入力された SQL からマテリアライゼーションのパターンを抽出し、ソース Logstore から中間結果を定期的に計算します。マテリアライズドビューを作成する際にターゲット SQL を提供するだけで、システムがマテリアライゼーションのロジックを自動的に処理します。
-
透過的リライト:SQL クエリを実行すると、SLS 実行エンジンは SQL 構造を分析し、既存のマテリアライズドビューと照合して、クエリを自動的にリライトします。SQL を変更したり、マテリアライズドビューを指定したりすることなく、ソース Logstore へのクエリを続行できます。
-
データ完全性のための自動マージ:すでにマテリアライズされている時間範囲については、エンジンはマテリアライズドビューから直接読み取ります。最新のマテリアライズされていないデータについては、ソース Logstore からリアルタイムで計算します。2つの結果セットは自動的にマージされ、完全で最新の結果が返されます。
透過的リライトは、マテリアライズドビューの中核的なメカニズムです。マテリアライズされた結果テーブルを手動でクエリする必要があるシステムとは異なり、SLS は SQL の照合、リライト、結果のマージを自動化し、既存のクエリに変更を加える必要はありません。マテリアライズドビューを作成した後、システムは開始時刻から現在時刻までの履歴データを非同期で事前計算する必要があるため、高速化はすぐには有効になりません。このビルドプロセスは、データ量と計算の複雑さに応じて、通常 1〜12 時間かかります。高速化は、事前計算がクエリの時間範囲をカバーした後にのみ有効になります。
範囲と制限
-
標準 Logstore のみがサポートされます。Query Logstore、MetricStore、および StoreView はサポートされていません。
-
プロジェクトごとに最大 100 のマテリアライズドビューを作成できます。
-
マテリアライズドビューは、コンソールまたは API 経由で作成および管理できます。
権限要件
Alibaba Cloud アカウントは、デフォルトで必要なすべての権限を持っています。RAM ユーザーには、次の権限を付与する必要があります。
マテリアライズドビューの使用
クエリページからの作成
クエリ・分析ページで SQL クエリを実行した後、そのクエリから直接マテリアライズドビューを作成できます。
-
Simple Log Service コンソールにログインします。
-
プロジェクト一覧 一覧で、対象のプロジェクトをクリックし、対象の Standard Logstore をクリックします。
-
クエリと分析ページで、高速化したい SQL ステートメントを入力し、検索と分析 をクリックします。
-
クエリ結果の統計チャートエリアで、マテリアライズドビューの作成をクリックします。
-
作成ウィザードで、設定を完了します。SQL ステートメントは現在のクエリで自動的に入力されます。その他のパラメーターは、マテリアライズドビューパネルからビューを作成する場合と同じです。
コンソールでの作成と管理
マテリアライズドビューの作成
-
SLS コンソールにログインします。
-
プロジェクト一覧 一覧で、目的のプロジェクトをクリックします。
-
左側のナビゲーションペインで、マテリアライズドビュー アイコンをクリックします。
-
マテリアライズドビューパネルで、ログデータを処理するために をクリックします。
-
作成ウィザードで、次の設定を構成します。
-
ソース Logstore:マテリアライズドビューのデータソースを構成します。
パラメーター
説明
プロジェクト
現在のプロジェクトで自動的に入力され、変更できません。
ソースタイプ
ログストア を選択します。現在、標準ログストアのみがサポートされています。
Logstore
ドロップダウンリストから対象の Logstore を選択します。
設定が完了したら、次へをクリックします。
-
マテリアライズドビューの構成:マテリアライズドビューの名前、SQL、およびその他のパラメーターを構成します。
パラメーター
説明
マテリアライズドビュー名
マテリアライズドビューの名前を入力します。システムは自動的に
mv_プレフィックスを追加します。手動で追加する必要はありません。SQLコード
高速化する SQL ステートメントを入力します。エディタは、シンタックスハイライトと自動補完をサポートしています。SQL ステートメントを入力した後、プレビュー をクリックして実行結果を検証します。
説明SQL ステートメントで使用される列名にはインデックスが作成されている必要があります。そうでない場合、プレビュー中にエラーが発生します。
開始時刻
データマテリアライゼーションの開始時刻を選択します。この時刻は生データの書き込み時間に基づきます。システムはこの時刻以降に書き込まれたデータのみをマテリアライズします。
マテリアライゼーション間隔
ビューが再計算される間隔 (分単位) を設定します。間隔が短いほど、マテリアライズされた結果はリアルタイムに近くなりますが、計算コストは増加します。
-
-
設定が完了したら、保存をクリックします。
マテリアライズドビューが作成されると、システムは自動的にマテリアライズドビューのクエリページにリダイレクトします。
説明マテリアライズドビューのデータ保持期間は、関連付けられたソース Logstore と同じです。プロジェクトごとに最大 100 のマテリアライズドビューを作成できます。
マテリアライズドビューの表示と管理
マテリアライズドビューを作成した後、コンソールで表示および管理できます。
-
マテリアライズドビューのリスト表示
対象のプロジェクトの左側のナビゲーションペインで、マテリアライズドビュー アイコンをクリックします。表示されるサイドパネルに、現在のプロジェクトのすべてのマテリアライズドビューが表示されます。
-
マテリアライズドビューの詳細表示
マテリアライズドビューのリストで、マテリアライズドビューの名前をクリックして詳細ページを開きます。詳細ページには、次の構成情報が表示されます。
-
[マテリアライズドビュー名]:
mv_プレフィックスを含む、マテリアライズドビューのフルネームです。 -
[開始日時]: データマテリアライゼーションの開始時刻です。
-
[ビューの更新間隔]:ビューが再計算される間隔です。
-
[Data Retention Period]:ソース Logstore のデータ保持期間と同じです。
-
[SQL コード]: マテリアライズドビューに対応する SQL 文です。
-
-
マテリアライズドビューの削除
マテリアライズドビューの詳細ページで、削除をクリックし、確認ダイアログボックスで[OK]をクリックします。
警告削除されたマテリアライズドビューは復元できません。対応するマテリアライズドストアも削除されます。
ダッシュボードクエリの高速化
ダッシュボードチャートのクエリレイテンシーが高い場合は、マテリアライズドビューを作成して高速化できます。詳細については、「ダッシュボードクエリの高速化」をご参照ください。
SDK の使用
SDK を使用して、プログラムでマテリアライズドビューを作成および管理することもできます。次の例では Java 言語を使用します。
-
SLS SDK for Java をインポートします。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.138</version> </dependency> -
次の例は、マテリアライズドビューの作成、一覧表示、取得、および削除の方法を示しています。必要に応じてコードを修正して実行してください。
-
コード内のパラメーターは次のように取得します。
-
AccessKey ID と AccessKey シークレットを取得するには、「AccessKey ペアの取得」をご参照ください。
-
エンドポイントを取得するには:
-
SLS コンソールにログインし、プロジェクトリストで対象のプロジェクトをクリックします。
-
プロジェクト名の横にある
アイコンをクリックしてプロジェクト概要ページを開き、パブリックエンドポイントをコピーします。
-
import com.aliyun.openservices.log.Client; import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.request.CreateMaterializedViewRequest; import com.aliyun.openservices.log.request.ListMaterializedViewsRequest; import com.aliyun.openservices.log.response.GetMaterializedViewResponse; import com.aliyun.openservices.log.response.ListMaterializedViewsResponse; import java.text.SimpleDateFormat; import java.util.concurrent.TimeUnit; public class MvDemo { static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); /** * Simple Log Service のエンドポイント。 この例では杭州を使用しています。 実際のリージョンに変更してください。 */ static String host = "cn-hangzhou.log.aliyuncs.com"; /** * Simple Log Service クライアントを作成します。 */ static Client client = new Client(host, accessId, accessKey); /** * プロジェクト名。 */ static String projectName = "xxx"; /** * Logstore 名。 */ static String logstoreName = "xxx"; public static void main(String[] args) throws Exception { String materializedViewName = "test_mv"; createMv(materializedViewName); // 指定された名前のマテリアライズドビューを作成します。 listMv(); // 現在のプロジェクトのマテリアライズドビューのリストを取得します。 getMv(materializedViewName); // 現在のマテリアライズドビューに関する情報を取得します。 // deleteMv(materializedViewName); // マテリアライズドビューを削除します。 } static int dateStrToSecond(String dateStr) throws Exception { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return (int)TimeUnit.MILLISECONDS.toSeconds(simpleDateFormat.parse(dateStr).getTime()); } static void createMv(String materializedViewName) throws Exception { String originalSql = "* | select count(l1) as cnt, l2 from stability group by l2"; // 高速化する SQL クエリに合わせてこれを変更します。 int aggInternalMins = 60; // マテリアライゼーションの間隔 (分単位)。 int startTime = dateStrToSecond("2025-07-30 00:00:00"); // マテリアライゼーションの開始時刻。生データの書き込み時間に基づきます。 この時刻以降に書き込まれたデータのみがマテリアライズされます。 int ttl = 0; // マテリアライズドストアの TTL。値が 0 の場合、TTL はソース Logstore の TTL と一致します。この TTL はソース Logstore の TTL より短くすることはできません。 // プロジェクトあたりのマテリアライズドビューの数は 100 を超えることはできません。 CreateMaterializedViewRequest request = new CreateMaterializedViewRequest(projectName, materializedViewName, logstoreName, originalSql, aggInternalMins, startTime, ttl); client.createMaterializedView(request); System.out.println("create materialized view " + materializedViewName); } static void listMv() throws LogException { ListMaterializedViewsRequest request = new ListMaterializedViewsRequest(projectName, "", 0, 10); // 0 と 10 はページネーションのパラメーターです。 ListMaterializedViewsResponse response = client.listMaterializedViews(request); System.out.println("total materialized view count: " + response.getTotal()); for (String materializedView : response.getMaterializedViews()) { System.out.println(materializedView); } } static void getMv(String materializedViewName) throws Exception { GetMaterializedViewResponse response = client.getMaterializedView(projectName, materializedViewName); System.out.println("get materialized view detail, name: " + materializedViewName); System.out.println("originalSql: " + response.getOriginalSql()); System.out.println("startTime: " + response.getStartTime()); System.out.println("ttl: " + response.getTtl()); } static void deleteMv(String materializedViewName ) throws LogException { client.deleteMaterializedView(projectName, materializedViewName); System.out.println("delete materialized view " + materializedViewName); } } -
-
サポートされる構文
-
すべてのスカラー関数と式がサポートされています。
-
WHERE、GROUP BY、LIMIT、TOP-N などの句がサポートされています。
-
次の表に示すように、一般的な集計関数がサポートされています。
|
集計関数 |
構文 |
|
count(*) count(1) count(x) count_if(boolean expression) max(x) max(x, n) min(x) min(x, n) sum(x) arbitrary(x) |
|
|
approx_distinct(x) approx_distinct(x, e) approx_percentile(x, percentage) |
課金
マテリアライズドビューの課金は、マテリアライズドストアに書き込まれたデータ量に基づきます。この量は、定期実行される SQL 計算の結果サイズに依存し、通常はソース Logstore のデータ量よりもはるかに小さくなります。課金は、標準 Logstore の取り込みデータ量課金モデルに従います。
マテリアライゼーションのコストを削減するには、GROUP BY 句でタイムスタンプやユーザー ID などの高カーディナリティフィールドを使用しないようにしてください。ビジネスの更新頻度に合ったマテリアライゼーション間隔を選択してください。