在超大規模資料情境下,即時 SQL 分析可能面臨執行逾時、結果不精確等問題。物化視圖通過對 SQL 子語句進行增量預計算並持久化中間結果,在後續查詢時自動利用已計算資料並透明改寫 SQL,將儀錶盤等報表情境的查詢耗時從分鐘級降低至秒級。
選擇加速策略
Log Service支援通過 SQL 對資料進行即時分析,每次 SQL 執行都對選定時間範圍內的全量資料進行計算。在大規模資料量下,可通過以下方式提升分析效能:
|
加速方式 |
原理 |
適用情境 |
限制 |
|
增加計算資源,提升單次查詢的並行度 |
資料量較大,但查詢 SQL 變化頻繁 |
資料規模仍有上限,超大規模下執行時間較長 |
|
|
物化視圖(本文) |
對固定 SQL 的子語句進行增量預計算,查詢時自動改寫為讀取預計算結果 |
SQL 相對固定的報表、儀錶盤情境,資料規模超大 |
僅支援標準型 LogStore,每個 Project 最多 100 個物化視圖 |
工作原理
-
原始日誌庫:原始日誌資料的 LogStore。物化視圖不會對原始日誌庫產生任何影響。
-
物化庫:建立物化視圖後,系統自動建立對應的物化庫,用於儲存預計算結果資料。
物化按照寫入資料流式處理。即使未經處理資料在日誌時間上存在亂序,定時物化的結果也不會重複或遺漏。
-
後台定時計算:系統自動從輸入的 SQL 中提取需要物化的模式,定時對原始 LogStore 的資料計算中間結果。建立物化視圖時只需提供目標 SQL,無需手動設計物化邏輯。
-
透明改寫:執行 SQL 查詢時,Log Service的執行引擎自動分析 SQL 結構,匹配已有的物化視圖並改寫查詢。查詢仍然直接面向原始 LogStore,無需修改 SQL 陳述式或指定物化視圖。
-
自動合并保證資料完整性:對於已物化的資料範圍,引擎直接從物化視圖中讀取結果;對於尚未物化的最新資料,從原始日誌庫即時讀取並計算。兩部分結果自動合并,確保返回完整且最新的查詢結果。
透明改寫是物化視圖的核心機制。與其他系統需要手動查詢物化結果表不同,Log Service自動完成 SQL 匹配、改寫和結果合并的全過程,無需修改任何常設查詢語句。建立物化視圖後,由於系統需要非同步執行歷史區間(起始時間至目前時間)的預計算任務,加速效果不會立即顯現。根據資料量級和計算複雜度,該構建過程通常耗時 1 至 12 小時。預計算覆蓋查詢時間範圍後,加速才可正式生效。
適用範圍
-
僅支援日誌庫標準型 LogStore,不支援查詢型 LogStore、時序庫 MetricStore、資料檢視 StoreView 等。
-
單個 Project 下建立的物化視圖數量不能超過 100 個。
-
支援通過控制台和 API 兩種方式建立和管理物化視圖。
許可權要求
阿里雲帳號預設擁有所有許可權,無需額外授權。RAM 使用者需配置如下許可權:
使用物化視圖
通過查詢分析頁面建立
在查詢分析頁面執行 SQL 後,可以直接基於當前查詢建立物化視圖。
-
單擊Project列表中的目標 Project,單擊目標 LogStore(標準型)。
-
在查詢分析頁面,輸入需要加速的 SQL 陳述式,單擊查詢 / 剖析。
-
在查詢結果的統計圖表地區,單擊建立物化視圖。
-
在建立物化視圖嚮導中完成配置。SQL 代碼會自動填入當前查詢的 SQL 陳述式,其他配置參數說明與通過物化視圖面板建立時相同。
通過物化視圖面板建立與管理
建立物化視圖
-
單擊Project列表中的目標 Project。
-
單擊左側導覽列的物化視圖表徵圖。
-
單擊物化視圖面板的立即建立。
-
按照建立物化視圖嚮導,完成以下配置。
-
來源庫:配置物化視圖的資料來源。
參數
說明
專案 Project
自動填滿為當前 Project,不可修改。
源庫類型
選擇Logstore。目前僅支援標準型 LogStore。
日誌庫
從下拉式清單中選擇要建立物化視圖的目標 LogStore。
配置完成後,單擊下一步。
-
物化視圖配置:配置物化視圖的名稱和 SQL 等參數。
參數
說明
物化視圖名稱
輸入物化視圖的名稱。系統會自動添加
mv_首碼,無需手動添加。SQL 代碼
輸入需要通過物化加速的 SQL 陳述式。編輯器支援文法高亮和自動補全。輸入 SQL 後,可以單擊預覽驗證執行結果。
說明SQL 中使用的列名必須已建立索引,否則預覽時會報錯。
起始時間
選擇開始物化的時間點。該時間點是未經處理資料的寫入時間,系統只物化該時間點之後的資料。
視圖更新間隔
配置物化視圖定時執行計算的時間周期,單位為分鐘。間隔越短,物化結果越接近即時,但計算成本相應增加。
-
-
配置完成後,單擊保存。
建立成功後,系統自動跳轉至物化視圖查詢頁面。
說明物化視圖的資料儲存時間與關聯的原始 LogStore 保持一致。單個 Project 下建立的物化視圖數量不能超過 100 個。
查看和管理物化視圖
建立物化視圖後,可以在控制台查看和管理物化視圖。
-
查看物化視圖列表
單擊目標 Project 左側導覽列的物化視圖表徵圖,通過彈出的側面板查看當前 Project 下的所有物化視圖。
-
查看物化視圖詳情
單擊物化視圖列表中的目標物化視圖名稱,進入物化視圖詳情頁。詳情頁展示以下配置資訊:
-
物化視圖名稱:物化視圖的完整名稱(含
mv_首碼)。 -
起始時間:開始物化的時間點。
-
視圖更新間隔:定時執行物化計算的時間周期。
-
數據儲存時間:與原始 LogStore 的資料儲存時間一致。
-
SQL代碼:物化視圖對應的 SQL 陳述式。
-
-
刪除物化視圖
在物化視圖詳情頁,單擊移除,然後單擊確認對話方塊的確認。
警告物化視圖刪除後不可恢複,對應的物化庫也會被刪除。
儀錶盤查詢加速
如果儀錶盤中存在查詢延遲較高的圖表,可以為其建立物化視圖進行查詢加速。具體操作,請參見儀錶盤查詢加速。
通過 SDK 建立與管理
也可以通過 SDK 以編程方式建立和管理物化視圖。以下以 Java 語言為例。
-
匯入Log Service Java SDK。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.138</version> </dependency> -
以下樣本包含物化視圖的建立、列表擷取、詳情擷取和刪除操作,按需修改後執行。
-
代碼中參數擷取方式參考如下:
-
accessKey 與 accessId 擷取參考建立AccessKey。
-
host 擷取方式:
-
登入Log Service控制台,單擊 Project 列表中的目標 Project。
-
單擊 Project 名稱右側的
進入專案概覽頁面,從訪問網域名稱複製公網網域名稱。
-
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"); /** * Log Service的服務存取點。此處以杭州為例,其它地區請根據實際情況填寫。 */ static String host = "cn-hangzhou.log.aliyuncs.com"; /** * 建立Log ServiceClient。 */ static Client client = new Client(host, accessId, accessKey); /** * Project名稱。 */ static String projectName = "xxx"; /** * LogStore名稱。 */ static String logstoreName = "xxx"; public static void main(String[] args) throws Exception { String materializedViewName = "test_mv"; createMv(materializedViewName);//建立指定名稱的物化視圖 listMv();//擷取當前project下的物化視圖列表 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表示和原始LogStore的TTL保持一致,物化庫的TTL不能小於原始庫的TTL。 //單個project下建立的物化視圖數目不能超過 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 中使用高基數欄位(如時間戳記、使用者識別碼),選擇與業務重新整理頻率匹配的物化更新間隔。