すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:マテリアライズドビューによる大規模データでのクエリパフォーマンスの向上

最終更新日:Jan 30, 2026

Simple Log Service (SLS) は、大規模なデータセットに対する SQL 分析を高速化するためにマテリアライズドビューを提供します。ターゲット SQL ステートメントから集約、フィルター、射影などの再利用可能なサブ結果を自動的に抽出し、保存します。後続のクエリに対して、SLS はこれらの事前計算された結果を使用するように SQL を自動的に書き換えることで、パフォーマンスを大幅に向上させます。

概要

マテリアライズドビューを使用する理由

SLS では、SQL を使用してリアルタイムのデータ分析が可能です。各 SQL クエリは、指定された時間範囲内のすべてのデータを分析します。大規模なデータセットの場合、標準の実行モードでは不正確な結果が返されたり、タイムアウトしたり、同時実行数の上限を超えたりする可能性があります。

高性能完全一致クエリ・分析 (専用 SQL) は、計算能力を大幅に向上させます。ただし、このモードにはデータサイズの上限があり、非常に大規模なデータセットでは実行時間が長くなる可能性があります。

ダッシュボードのリフレッシュなど、SQL の実行時間に厳しい要件があるシナリオでは、マテリアライズドビューの使用を検討してください。マテリアライズドビューは、SQL サブステートメントの中間結果を増分的に事前計算して保存します。レポートをリフレッシュすると、システムはこれらの事前計算された結果を自動的に使用して、パフォーマンスを大幅に向上させます。

仕組み

コンポーネント

説明

ソース Logstore

生ログを含む Logstore です。マテリアライズドビューはソース Logstore に影響を与えません。

マテリアライズドデータベース

マテリアライズドビューの結果を保存するために自動的に作成されるデータベースです。データは書き込み時にストリームとして処理されます。生ログの順序が時間通りでなくても、スケジュールされたマテリアライズの結果でデータが重複したり欠落したりすることはありません。

スケジュールされたバックグラウンド計算

システムは入力された SQL からマテリアライズパターンを自動的に抽出し、ソース Logstore から中間結果を定期的に計算します。マテリアライズドビューを作成するには、高速化したい SQL クエリを提供するだけでよく、マテリアライズの詳細を管理する必要はありません。

透明な再書き込み

SQL クエリを実行する際、SLS の実行エンジンは SQL 構造をインテリジェントに分析し、クエリを対応するマテリアライズドビューと自動的に照合し、クエリを透過的に書き換えます。ソース Logstore を直接クエリすると、コンピュートエンジンが適切なマテリアライズドビューを検出し、それを使用してクエリを書き換えます。この書き換えプロセスは、ユーザーに対して透過的に行われます。

最新データの可視性

コンピュートエンジンは、すでにマテリアライズされたデータ範囲についてはマテリアライズドビューからデータを読み取ります。まだマテリアライズされていない新しいデータについては、エンジンがソース Logstore からリアルタイムでデータを読み取り、計算します。その後、エンジンは 2 つの結果セットを自動的にマージして、完全な結果を返します。これにより、パフォーマンス上の利点を提供しつつ、最新のデータがリアルタイムで可視化されることを保証します。

前提条件

開始する前に、以下の要件が満たされていることを確認してください:

要件

説明

Logstore タイプ

標準 Logstore のみ。クエリ Logstore、メトリックストア、StoreView はサポートされていません。

管理方法

API のみ。コンソールでは、マテリアライズドビューの操作はまだサポートされていません。

SDK バージョン

Java SDK 0.6.138 以降

権限

log:CreateMaterializedViewlog:GetMaterializedViewlog:ListMaterializedViewslog:DeleteMaterializedView (RAM ユーザーのみ)

クイックスタート

3 つのステップでマテリアライズドビューを作成します:

// 1. SDK のインポート
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.request.CreateMaterializedViewRequest;

// 2. クライアントの初期化
Client client = new Client("cn-hangzhou.log.aliyuncs.com", accessId, accessKey);

// 3. マテリアライズドビューの作成
CreateMaterializedViewRequest request = new CreateMaterializedViewRequest(
    "your-project",           // プロジェクト名
    "my_mv",                   // マテリアライズドビュー名
    "your-logstore",           // ソース Logstore
    "* | select count(*) as cnt", // 高速化する SQL
    60,                        // 計算間隔 (分)
    startTime,                 // 開始時刻 (UNIX タイムスタンプ)
    0                          // TTL (0 = ソースと同じ)
);
client.createMaterializedView(request);

完全な例については、以下の詳細な手順をご参照ください。

マテリアライズドビューの使用

このセクションでは、Java を例に、ステップバイステップの手順を説明します。

ステップ 1:権限の設定

Alibaba Cloud アカウントは、デフォルトですべての権限を持っており、追加の権限付与は不要です。Resource Access Management (RAM) ユーザーの場合は、以下の権限があることを確認してください:

マテリアライズドビューに必要な権限

Alibaba Cloud アカウントのオーナーに、SLS の AliyunLogFullAccess システムポリシーをリクエストしてください。詳細な制御を行うには、次の表の権限を持つカスタム権限ポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。

操作

権限アクション

マテリアライズドビューの作成

log:CreateMaterializedView

マテリアライズドビューの更新

log:UpdateMaterializedView

マテリアライズドビューの詳細の取得

log:GetMaterializedView

マテリアライズドビューの削除

log:DeleteMaterializedView

マテリアライズドビューの一覧表示

log:ListMaterializedViews

ステップ 2:SDK のインポート

以下のバージョンの SLS SDK for Java をインポートします:

<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>aliyun-log</artifactId>
    <version>0.6.138</version>
</dependency>

ステップ 3:マテリアライズドビューの作成、一覧表示、取得、削除

以下の例は、マテリアライズドビューの作成、一覧表示、詳細の取得、削除の方法を示しています。必要に応じてコードを修正して実行してください。

パラメーターの取得:

  • AccessKey ID と AccessKey Secret を取得するには、「AccessKey ペアの作成」をご参照ください。

  • ホストエンドポイントを取得するには:

    1. Simple Log Service コンソールにログインします。

    2. プロジェクトリストで、対象のプロジェクトをクリックします。

    3. プロジェクト名の横にあるアイコンをクリックして、プロジェクトの概要ページに移動します。[Endpoint] セクションで、パブリックエンドポイントをコピーします。

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");
    /**
     * SLS エンドポイント。この例では中国 (杭州) を使用しています。実際のリージョンに変更してください。
     */
    static String host = "cn-hangzhou.log.aliyuncs.com";
    /**
     * SLS クライアントを作成します。
     */
    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 {
        // マテリアライズドビューで高速化する SQL クエリ。
        String originalSql = "* | select count(l1) as cnt, l2 from stability group by l2";
        // スケジュールされたマテリアライズの期間 (分)。
        int aggIntervalMins = 60;
        // マテリアライズの開始時刻。生データの書き込み時間に基づきます。
        // この時刻以降の生データのみがマテリアライズされます。
        int startTime = dateStrToSecond("2025-07-30 00:00:00");
        // マテリアライズ Logstore の TTL。
        // 値 0 は、ソース Logstore の TTL と同じであることを意味します。
        // マテリアライズ Logstore の TTL は、ソース Logstore の TTL より短くすることはできません。
        int ttl = 0;
        // 1 つのプロジェクト内のマテリアライズドビューの数は 100 を超えることはできません。
        CreateMaterializedViewRequest request = new CreateMaterializedViewRequest(
            projectName, materializedViewName, logstoreName, originalSql, aggIntervalMins, startTime, ttl);
        client.createMaterializedView(request);
        System.out.println("create materialized view " + materializedViewName);
    }

    static void listMv() throws LogException
    {
        // 0 と 10 はページ分割クエリのパラメーターです。
        ListMaterializedViewsRequest request = new ListMaterializedViewsRequest(projectName, "", 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);
    }

}

サポートされる構文

  • すべてのスカラー関数と式がサポートされています。

  • WHEREGROUP BYLIMITTOP-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)

課金

マテリアライズドビューの課金は、マテリアライズドビューを格納する Logstore に書き込まれるデータ量に基づきます。このデータ量は、スケジュールされた SQL クエリの結果のサイズに依存します。データ量は通常、ソース Logstore のデータ量よりもはるかに小さくなります。課金は、標準 Logstore のデータ書き込み量に応じた従量課金モデルに基づきます。