Simple Log Service (SLS) menyediakan materialized views untuk mempercepat analisis SQL pada dataset skala besar. SLS secara otomatis mengekstraksi dan menyimpan subhasil yang dapat digunakan ulang—seperti agregasi, filter, dan proyeksi—dari pernyataan SQL target. Untuk kueri berikutnya, SLS secara otomatis menulis ulang SQL tersebut agar menggunakan hasil yang telah diprekomputasi ini, sehingga performa meningkat secara signifikan.
Ikhtisar
Mengapa menggunakan materialized views
SLS memungkinkan analisis data real-time menggunakan SQL. Setiap kueri SQL menganalisis seluruh data dalam rentang waktu tertentu. Pada dataset besar, mode eksekusi standar dapat menghasilkan hasil yang tidak akurat, timeout, atau melebihi batas konkurensi.
Kueri dan analisis akurat berperforma tinggi (Dedicated SQL) secara signifikan meningkatkan daya komputasi. Namun, mode ini memiliki batas ukuran data dan dapat menghasilkan waktu eksekusi yang lama untuk dataset yang sangat besar.
Untuk skenario dengan persyaratan ketat terhadap waktu eksekusi SQL—seperti refresh dashboard—pertimbangkan penggunaan materialized views. Materialized views melakukan pre-komputasi secara inkremental dan menyimpan hasil antara dari sub-pernyataan SQL. Saat Anda merefresh laporan, sistem secara otomatis menggunakan hasil yang telah diprekomputasi ini untuk meningkatkan performa secara signifikan.
Cara kerja
Component | Description |
Source logstore | Logstore yang berisi log mentah. Materialized views tidak memengaruhi source logstore. |
Materialized database | Database yang dibuat secara otomatis untuk menyimpan hasil materialized view. Data diproses sebagai aliran saat ditulis. Bahkan jika log mentah tidak terurut berdasarkan waktu, hasil materialisasi terjadwal tidak akan menduplikasi atau kehilangan data apa pun. |
Scheduled background computation | Sistem secara otomatis mengekstraksi pola materialisasi dari SQL input dan secara berkala menghitung hasil antara dari source logstore. Untuk membuat materialized view, cukup berikan kueri SQL yang ingin dipercepat. Anda tidak perlu mengelola detail materialisasi. |
Transparent rewrite | Saat menjalankan kueri SQL, mesin eksekusi SLS menganalisis struktur SQL secara cerdas, secara otomatis mencocokkan kueri dengan materialized view yang sesuai, dan menulis ulang kueri tersebut secara transparan. Anda langsung mengkueri source logstore, dan mesin komputasi menemukan serta menggunakan materialized view yang tepat untuk menulis ulang kueri. Proses penulisan ulang ini transparan bagi Anda. |
Latest data visibility | Mesin komputasi membaca data dari materialized view untuk rentang data yang telah dimaterialisasi. Untuk data baru yang belum dimaterialisasi, mesin membaca dan menghitung data secara real-time dari source logstore. Mesin kemudian secara otomatis menggabungkan kedua set hasil tersebut untuk mengembalikan hasil lengkap. Hal ini memberikan manfaat performa sekaligus memastikan data terbaru tetap terlihat secara real-time. |
Prasyarat
Sebelum memulai, pastikan persyaratan berikut terpenuhi:
Requirement | Description |
Logstore type | Hanya logstore Standard. Query logstores, Metricstores, dan StoreViews tidak didukung. |
Management method | Hanya API. Konsol belum mendukung operasi materialized view. |
SDK version | Java SDK 0.6.138 atau lebih baru |
Permissions |
|
Memulai dengan cepat
Buat materialized view dalam tiga langkah:
// 1. Impor SDK
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.request.CreateMaterializedViewRequest;
// 2. Inisialisasi client
Client client = new Client("cn-hangzhou.log.aliyuncs.com", accessId, accessKey);
// 3. Buat materialized view
CreateMaterializedViewRequest request = new CreateMaterializedViewRequest(
"your-project", // Nama project
"my_mv", // Nama materialized view
"your-logstore", // Source logstore
"* | select count(*) as cnt", // SQL yang akan dipercepat
60, // Interval komputasi (menit)
startTime, // Waktu mulai (Unix timestamp)
0 // TTL (0 = sama seperti sumber)
);
client.createMaterializedView(request);
Untuk contoh lengkap, lihat petunjuk detail di bawah ini.
Gunakan materialized views
Bagian ini memberikan petunjuk langkah demi langkah menggunakan Java sebagai contoh.
Langkah 1: Konfigurasikan izin
Akun Alibaba Cloud memiliki semua izin secara default dan tidak memerlukan otorisasi tambahan. Jika Anda adalah Pengguna Resource Access Management (RAM), pastikan Anda memiliki izin berikut:
Langkah 2: Impor SDK
Impor versi berikut dari SDK SLS untuk Java:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log</artifactId>
<version>0.6.138</version>
</dependency>Langkah 3: Buat, daftar, ambil, dan hapus materialized views
Contoh berikut menunjukkan cara membuat, mendaftar, mengambil detail, dan menghapus materialized views. Ubah dan jalankan kode sesuai kebutuhan.
Dapatkan parameter:
Untuk mendapatkan ID AccessKey dan Rahasia AccessKey, lihat Buat pasangan Kunci Akses.
Untuk mendapatkan titik akhir host:
Masuk ke Konsol Simple Log Service.
Pada daftar Projects, klik project target.
Klik ikon di samping nama project untuk membuka halaman ikhtisar project. Di bagian Endpoint, salin titik akhir publik.
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");
/**
* Titik akhir SLS. Contoh ini menggunakan Hangzhou. Ubah sesuai wilayah Anda.
*/
static String host = "cn-hangzhou.log.aliyuncs.com";
/**
* Buat client SLS.
*/
static Client client = new Client(host, accessId, accessKey);
/**
* Nama project.
*/
static String projectName = "xxx";
/**
* Nama logstore.
*/
static String logstoreName = "xxx";
public static void main(String[] args) throws Exception {
String materializedViewName = "test_mv";
createMv(materializedViewName); // Buat materialized view dengan nama yang ditentukan.
listMv(); // Dapatkan daftar materialized views di project saat ini.
getMv(materializedViewName); // Dapatkan informasi tentang materialized view saat ini.
// deleteMv(materializedViewName); // Hapus materialized view.
}
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 {
// Kueri SQL yang akan dipercepat dengan materialized view.
String originalSql = "* | select count(l1) as cnt, l2 from stability group by l2";
// Periode materialisasi terjadwal dalam menit.
int aggIntervalMins = 60;
// Waktu mulai untuk materialisasi. Berdasarkan waktu penulisan data mentah.
// Hanya data mentah setelah waktu ini yang dimaterialisasi.
int startTime = dateStrToSecond("2025-07-30 00:00:00");
// TTL dari logstore materialisasi.
// Nilai 0 berarti sama dengan TTL logstore sumber.
// TTL logstore materialisasi tidak boleh kurang dari TTL logstore sumber.
int ttl = 0;
// Jumlah materialized views dalam satu project tidak boleh melebihi 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 dan 10 adalah parameter untuk kueri terpaginasi.
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);
}
}Sintaks yang didukung
Semua fungsi dan ekspresi skalar didukung.
Pernyataan seperti
WHERE,GROUP BY,LIMIT, danTOP-Ndidukung.Fungsi agregat umum didukung. Untuk daftar lengkap, lihat tabel berikut:
Supported aggregate functions | Syntax |
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) |
Penagihan
Penagihan untuk materialized views didasarkan pada volume data yang ditulis ke logstore yang menyimpan materialized view tersebut. Volume data ini bergantung pada ukuran hasil dari kueri SQL terjadwal. Volume data biasanya jauh lebih kecil daripada logstore sumber. Penagihan mengikuti model Pay-by-ingested-data untuk logstore Standard.