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 以降 |
権限 |
|
クイックスタート
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) ユーザーの場合は、以下の権限があることを確認してください:
ステップ 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 ペアの作成」をご参照ください。
ホストエンドポイントを取得するには:
Simple Log Service コンソールにログインします。
プロジェクトリストで、対象のプロジェクトをクリックします。
プロジェクト名の横にあるアイコンをクリックして、プロジェクトの概要ページに移動します。[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);
}
}サポートされる構文
すべてのスカラー関数と式がサポートされています。
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) |
課金
マテリアライズドビューの課金は、マテリアライズドビューを格納する Logstore に書き込まれるデータ量に基づきます。このデータ量は、スケジュールされた SQL クエリの結果のサイズに依存します。データ量は通常、ソース Logstore のデータ量よりもはるかに小さくなります。課金は、標準 Logstore のデータ書き込み量に応じた従量課金モデルに基づきます。