本文介紹SQL增強實現原理和操作步驟,協助您快速掌握其核心能力。
實現原理
背景資訊
Log Service將儲存與計算分離:儲存層抽象為分區(Shard),負責資料存放區和管理;計算層抽象為SQL,提供查詢分析能力。
要提升SLS的分析效能,關鍵是增強儲存層和計算層的能力。以下是幾種常見方案及其對比。
方案一:分裂Shard
通過手動分裂Shard實現儲存層能力擴充,間接提升計算輸送量。
方案局限:
僅對新寫入資料生效。
活躍Shard持續產生租用費用(詳見費用說明)。
單查詢受並發數/資料量限制。
需人工介入分裂/合併作業。
方案二:查詢分治
將大查詢拆解為多個子查詢,通過二次彙總擷取最終結果。
方案局限:
需維護二次彙總邏輯與中間結果儲存(可通過定時查詢與分析(定時SQL)實現)。
分析維度變更導致彙總邏輯重構。
資料量級過大時仍存在計算瓶頸。
方案三:SQL增強
開啟SQL增強後,Log Service會根據資料規模自動擴充儲存和計算資源,加速分析過程。
對比維度 | 方案一(分裂Shard) | 方案二(查詢分治方案) | 方案三(SQL增強) |
資源隔離性 | 儲存資源獨立,共用計算資源 | 儲存資源獨立,共用計算資源 | 儲存資源獨立,提供彈性獨享資源 |
擴充粒度 | 儲存層擴充 | 計算層擴充 | 儲存+計算層Auto Scaling |
營運成本 | 需人工幹預 | 大查詢拆解為多個子查詢 | 全自動調度 |
查詢複雜度 | 原生SQL支援 | 需二次開發 | 原生SQL支援 |
前提條件
已建立Standard Logstore。具體操作,請參見建立基礎LogStore。
已採集日誌。具體操作,請參見資料擷取。
已配置索引。具體操作,請參見配置索引。
操作步驟
Log Service支援如下兩種開啟SQL增強方式。
單次開啟:僅當前LogStore下的查詢和分析操作,使用SQL增強。
預設開啟:當前Project下的所有查詢和分析操作(包括警示、儀錶盤等),都使用SQL增強。
控制台
單次開啟SQL增強
在Project列表地區,單擊目標Project。

在頁簽中,單擊目標Logstore。

單擊。

預設開啟SQL增強
在Project列表地區,單擊目標Project。

單擊
表徵圖。
將滑鼠懸浮在SQL獨享版CU數上,然後單擊設定。

在編輯SQL獨享版CU數面板中,開啟是否預設開啟的開關,然後單擊確定。
API
單次開啟SQL增強
以下兩個參數設定一個即可。
參數
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為例。
前提條件
單次開啟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_mil140億
0.004435
* | select avg(double_0), sum(double_0), max(double_0), min(double_0), count(double_0) from stress_s1_mil140億
0.006504
* | select avg(double_0), sum(double_1), max(double_2), min(double_3), count(double_4) from stress_s1_mil140億
0.013600
* | select key_0 , avg(double_0) as pv from stress_s1_mil1 group by key_0 order by pv desc limit 100040億
0.011826
* | select long_0, avg(double_0) as pv from stress_s1_mil1 group by long_0 order by pv desc limit 100040億
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 10003億
0.010791
* | select avg(double_0) from stress_s1_mil1 where key_0='key_987'40億
0.00007
> 增強SQL