全部產品
Search
文件中心

Simple Log Service:SQL增強

更新時間:Jan 06, 2026

本文介紹SQL增強實現原理和操作步驟,協助您快速掌握其核心能力。

實現原理

背景資訊

Log Service將儲存與計算分離:儲存層抽象為分區(Shard),負責資料存放區和管理;計算層抽象為SQL,提供查詢分析能力。

要提升SLS的分析效能,關鍵是增強儲存層和計算層的能力。以下是幾種常見方案及其對比。

image

方案一:分裂Shard

通過手動分裂Shard實現儲存層能力擴充,間接提升計算輸送量。

方案局限

  • 僅對新寫入資料生效。

  • 活躍Shard持續產生租用費用(詳見費用說明)。

  • 單查詢受並發數/資料量限制。

  • 需人工介入分裂/合併作業。

方案二:查詢分治

將大查詢拆解為多個子查詢,通過二次彙總擷取最終結果。

方案局限

  • 需維護二次彙總邏輯與中間結果儲存(可通過定時查詢與分析(定時SQL)實現)。

  • 分析維度變更導致彙總邏輯重構。

  • 資料量級過大時仍存在計算瓶頸。

方案三:SQL增強

開啟SQL增強後,Log Service會根據資料規模自動擴充儲存和計算資源,加速分析過程。

image

對比維度

方案一(分裂Shard)

方案二(查詢分治方案)

方案三(SQL增強)

資源隔離性

儲存資源獨立,共用計算資源

儲存資源獨立,共用計算資源

儲存資源獨立,提供彈性獨享資源

擴充粒度

儲存層擴充

計算層擴充

儲存+計算層Auto Scaling

營運成本

需人工幹預

大查詢拆解為多個子查詢

全自動調度

查詢複雜度

原生SQL支援

需二次開發

原生SQL支援

前提條件

操作步驟

Log Service支援如下兩種開啟SQL增強方式。

  • 單次開啟:僅當前LogStore下的查詢和分析操作,使用SQL增強。

  • 預設開啟:當前Project下的所有查詢和分析操作(包括警示、儀錶盤等),都使用SQL增強。

控制台

單次開啟SQL增強

  1. 登入Log Service控制台

  2. 在Project列表地區,單擊目標Project。

    image

  3. 日誌儲存 > 日誌庫頁簽中,單擊目標Logstore。

    image

  4. 單擊image > 增強SQL

    image

預設開啟SQL增強

  1. 登入Log Service控制台

  2. 在Project列表地區,單擊目標Project。

    image

  3. 單擊專案概覽表徵圖。

    image.png

  4. 將滑鼠懸浮在SQL獨享版CU數上,然後單擊設定

    SQL獨享版

  5. 編輯SQL獨享版CU數面板中,開啟是否預設開啟的開關,然後單擊確定

API

單次開啟SQL增強

  • GetLogs(返回結果不壓縮傳輸) - 查詢日誌庫日誌

    以下兩個參數設定一個即可。

    • 參數powerSql:設定為true,表示當前查詢使用SQL增強。設定為false(預設值),使用SQL普通版。

    • 參數query:例如查詢分析語句為* | select count(*) as pv,在分析語句中增加set session parallel_sql=true;,表示使用SQL增強。查詢分析語句為:* | set session parallel_sql=true; select count(*) as pv 。

  • GetLogsV2(返回結果壓縮後傳輸) - 查詢LogStore中的日誌資料

    以下兩個參數設定一個即可。

    • 參數powerSql:設定為true,表示當前查詢使用SQL增強。設定為false(預設值),使用SQL普通版。

    • 參數query:例如查詢分析語句為* | select count(*) as pv,在分析語句中增加set session parallel_sql=true;,表示使用SQL增強。查詢分析語句為:* | set session parallel_sql=true; select count(*) as pv 。

預設開啟SQL增強

建立SQL獨享執行個體 介面參數useAsDefault=true,為Project預設開啟SQL增強。

SDK

此處以Java SDK為例。

前提條件

安裝Java SDK

單次開啟SQL增強

  • GetLogs()方法

    以下兩個參數設定一個即可。

    • 參數powerSql:設定為true,表示當前查詢使用SQL增強。設定為false(預設值),使用SQL普通版。

    • 參數query:例如查詢分析語句為* | select count(*) as pv,在分析語句中增加set session parallel_sql=true;,表示使用SQL增強。查詢分析語句為:* | set session parallel_sql=true; select count(*) as pv 。

    import com.aliyun.openservices.log.Client;
    import com.aliyun.openservices.log.exception.LogException;
    import com.aliyun.openservices.log.response.GetLogsResponse;
    
    import java.util.Date;
    
    public class CreateSqlInstance {
        public static void main(String[] args) throws LogException {
            // 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret。
            String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            // 設定Log Service的服務存取點。此處以杭州為例,其它地區請根據實際情況填寫。
            String host = "https://cn-beijing.log.aliyuncs.com";
            // 建立Log ServiceClient。
            Client client = new Client(host, accessId, accessKey);
            // 輸入Project名稱。
            String projectName = "aliyun-project-test";
            // logstore名稱
            String logstore = "request_log";
            // 是否使用SQL增強,預設為false
            boolean useAsDefault = true;
            // SQL查詢分析語句
            String query = "* | select count(1)";
            // 僅當 query 參數為查詢語句時,該參數有效,表示請求返回的最大日誌條數。最小值為 0,最大值為 100,預設值為 100。
            int line = 3;
            // 僅當 query 參數為查詢語句時,該參數有效,表示查詢開始行。預設值為 0。
            int offset = 0;
            // 用於指定返回結果是否按日誌時間戳記降序返回日誌,精確到分鐘層級。
            // true:按照日誌時間戳記降序返回日誌。
            // false(預設值):按照日誌時間戳記升序返回日誌。
            boolean reverse = false;
            // 是否使用 SQL 增強。
            // true:使用 SQL 增強。
            // false(預設值):使用 SQL 普通版。
            boolean powerSql = true;
            int from = (int) (new Date().getTime() / 1000 - 600);
            int to = (int) (new Date().getTime() / 1000);
            GetLogsResponse getLogsResponse = client.GetLogs(projectName, logstore, from, to, "", sql, line, offset, reverse, powerSql);
            System.out.println(getLogsResponse.getCpuSec());
        }
    }

預設開啟SQL增強

介面參數boolean useAsDefault = true,為Project預設開啟SQL增強。

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.CreateOrUpdateSqlInstanceRequest;

public class CreateSqlInstance {
    public static void main(String[] args) throws LogException {
        // 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret。
        String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // 輸入Project名稱。
        String projectName = "aliyun-test-project";
        // 設定Log Service的服務存取點。此處以杭州為例,其它地區請根據實際情況填寫。
        String host = "https://cn-beijing.log.aliyuncs.com";
        // 建立Log ServiceClient。
        Client client = new Client(host, accessId, accessKey);
        int cu = 100;
        boolean useAsDefault = true;
        client.createSqlInstance(new CreateOrUpdateSqlInstanceRequest(projectName, cu, useAsDefault));
    }
}

常見問題

  • 如何擷取CPU時間?

    執行查詢和分析操作後,將滑鼠懸浮在分析結果上,查看CPU時間,如下圖所示。計費

  • 使用一次SQL獨享版的費用是多少?

    在不同的資料量中執行不同的查詢和分析語句,會產生不同的SQL獨享版費用,案例如下表所示。

    查詢和分析語句

    資料量(行)

    平均每次的費用(美元

    * | select avg(double_0) from stress_s1_mil1

    40億

    0.004435

    * | select avg(double_0), sum(double_0), max(double_0), min(double_0), count(double_0) from stress_s1_mil1

    40億

    0.006504

    * | select avg(double_0), sum(double_1), max(double_2), min(double_3), count(double_4) from stress_s1_mil1

    40億

    0.013600

    * | select key_0 , avg(double_0) as pv from stress_s1_mil1 group by key_0 order by pv desc limit 1000

    40億

    0.011826

    * | select long_0, avg(double_0) as pv from stress_s1_mil1 group by long_0 order by pv desc limit 1000

    40億

    0.011087

    * | select long_0, long_1, avg(double_0) as pv from stress_s1_mil1 group by long_0,long_1 order by pv desc limit 1000

    3億

    0.010791

    * | select avg(double_0) from stress_s1_mil1 where key_0='key_987'

    40億

    0.00007