全部產品
Search
文件中心

Simple Log Service:通過物化視圖提升超大規模資料執行效能

更新時間:Apr 26, 2026

在超大規模資料情境下,即時 SQL 分析可能面臨執行逾時、結果不精確等問題。物化視圖通過對 SQL 子語句進行增量預計算並持久化中間結果,在後續查詢時自動利用已計算資料並透明改寫 SQL,將儀錶盤等報表情境的查詢耗時從分鐘級降低至秒級。

選擇加速策略

Log Service支援通過 SQL 對資料進行即時分析,每次 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 使用者需配置如下許可權:

物化視圖要求的權限

向阿里雲帳號管理員申請Log Service的系統權限原則 AliyunLogFullAccess,或參考下表通過建立自訂權限原則實現精微調權限管理。

操作

許可權 Action

建立物化視圖

log:CreateMaterializedView

更新物化視圖

log:UpdateMaterializedView

擷取指定物化視圖詳情

log:GetMaterializedView

刪除物化視圖

log:DeleteMaterializedView

擷取物化視圖列表

log:ListMaterializedViews

使用物化視圖

通過查詢分析頁面建立

在查詢分析頁面執行 SQL 後,可以直接基於當前查詢建立物化視圖。

  1. 登入Log Service控制台

  2. 單擊Project列表中的目標 Project,單擊目標 LogStore(標準型)。

  3. 在查詢分析頁面,輸入需要加速的 SQL 陳述式,單擊查詢 / 剖析

  4. 在查詢結果的統計圖表地區,單擊建立物化視圖

  5. 在建立物化視圖嚮導中完成配置。SQL 代碼會自動填入當前查詢的 SQL 陳述式,其他配置參數說明與通過物化視圖面板建立時相同。

通過物化視圖面板建立與管理

建立物化視圖

  1. 登入Log Service控制台

  2. 單擊Project列表中的目標 Project。

  3. 單擊左側導覽列的物化視圖表徵圖。

  4. 單擊物化視圖面板的立即建立

  5. 按照建立物化視圖嚮導,完成以下配置。

    1. 來源庫:配置物化視圖的資料來源。

      參數

      說明

      專案 Project

      自動填滿為當前 Project,不可修改。

      源庫類型

      選擇Logstore。目前僅支援標準型 LogStore。

      日誌庫

      從下拉式清單中選擇要建立物化視圖的目標 LogStore。

      配置完成後,單擊下一步

    2. 物化視圖配置:配置物化視圖的名稱和 SQL 等參數。

      參數

      說明

      物化視圖名稱

      輸入物化視圖的名稱。系統會自動添加 mv_ 首碼,無需手動添加。

      SQL 代碼

      輸入需要通過物化加速的 SQL 陳述式。編輯器支援文法高亮和自動補全。輸入 SQL 後,可以單擊預覽驗證執行結果。

      說明

      SQL 中使用的列名必須已建立索引,否則預覽時會報錯。

      起始時間

      選擇開始物化的時間點。該時間點是未經處理資料的寫入時間,系統只物化該時間點之後的資料。

      視圖更新間隔

      配置物化視圖定時執行計算的時間周期,單位為分鐘。間隔越短,物化結果越接近即時,但計算成本相應增加。

  6. 配置完成後,單擊保存

    建立成功後,系統自動跳轉至物化視圖查詢頁面。

    說明

    物化視圖的資料儲存時間與關聯的原始 LogStore 保持一致。單個 Project 下建立的物化視圖數量不能超過 100 個。

查看和管理物化視圖

建立物化視圖後,可以在控制台查看和管理物化視圖。

  • 查看物化視圖列表

    單擊目標 Project 左側導覽列的物化視圖表徵圖,通過彈出的側面板查看當前 Project 下的所有物化視圖。

  • 查看物化視圖詳情

    單擊物化視圖列表中的目標物化視圖名稱,進入物化視圖詳情頁。詳情頁展示以下配置資訊:

    • 物化視圖名稱:物化視圖的完整名稱(含 mv_ 首碼)。

    • 起始時間:開始物化的時間點。

    • 視圖更新間隔:定時執行物化計算的時間周期。

    • 數據儲存時間:與原始 LogStore 的資料儲存時間一致。

    • SQL代碼:物化視圖對應的 SQL 陳述式。

  • 刪除物化視圖

    在物化視圖詳情頁,單擊移除,然後單擊確認對話方塊的確認

    警告

    物化視圖刪除後不可恢複,對應的物化庫也會被刪除。

儀錶盤查詢加速

如果儀錶盤中存在查詢延遲較高的圖表,可以為其建立物化視圖進行查詢加速。具體操作,請參見儀錶盤查詢加速

通過 SDK 建立與管理

也可以通過 SDK 以編程方式建立和管理物化視圖。以下以 Java 語言為例。

  1. 匯入Log Service Java SDK。

    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>aliyun-log</artifactId>
        <version>0.6.138</version>
    </dependency>
  2. 以下樣本包含物化視圖的建立、列表擷取、詳情擷取和刪除操作,按需修改後執行。

    • 代碼中參數擷取方式參考如下:

      • accessKey 與 accessId 擷取參考建立AccessKey

      • host 擷取方式:

        1. 登入Log Service控制台,單擊 Project 列表中的目標 Project。

        2. 單擊 Project 名稱右側的image進入專案概覽頁面,從訪問網域名稱複製公網網域名稱。

      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(xn)

min(x)

min(xn)

sum(x)

arbitrary(x)

估算函數

approx_distinct(x)

approx_distinct(xe)

approx_percentile(xpercentage)

計費說明

物化視圖的計費基於寫入物化庫的資料量,取決於 SQL 定時計算的結果資料量,通常遠小於原始 LogStore 的資料量。具體按照標準型 LogStore 的按寫入資料量計費

說明

降低物化成本的方式:避免在 GROUP BY 中使用高基數欄位(如時間戳記、使用者識別碼),選擇與業務重新整理頻率匹配的物化更新間隔。