このトピックでは、SQL 拡張の実装と使用方法の手順について説明します。 このようにして、コア機能を効率的に使用できます。
実装
背景情報
Simple Log Service は、ストレージとコンピューティングを分離します。 ストレージレイヤーはシャードとして抽象化され、データのストレージと管理に使用されます。 コンピューティングレイヤーは SQL として抽象化され、クエリと分析機能を提供します。
Simple Log Service の分析パフォーマンスを向上させるには、ストレージレイヤーとコンピューティングレイヤーの機能を拡張する必要があります。 次のセクションでは、一般的なソリューションとソリューションの比較を示します。
ソリューション 1:シャードを分割する
シャードを手動で分割して、ストレージレイヤーの機能を拡張できます。 このようにして、コンピューティングスループットが向上します。 詳細については、「シャードを分割する」をご参照ください。
制限:
このメソッドは、新しく書き込まれたデータに対してのみ有効です。
アクティブなシャードに対して課金されます。 詳細については、「請求の説明」をご参照ください。
クエリは、同時実行文の最大数とデータ量の影響を受けます。
シャードの分割またはマージには、手動操作が必要です。
ソリューション 2:クエリをサブクエリに分割する
クエリをサブクエリに分割し、サブクエリ結果に基づいて二次集約を実行して、最終結果を取得できます。
制限:
二次集約ロジックを維持し、サブクエリ結果を保存する必要があります。 詳細については、「スケジュール済み SQL」をご参照ください。
分析ディメンションの変更により、集約ロジックの再構築が必要になります。
データ量が大きすぎると、コンピューティングのボトルネックが依然として存在します。
ソリューション 3:SQL 拡張を有効にする
SQL 拡張を有効にすると、Simple Log Service はデータ量に基づいてストレージとコンピューティングリソースを自動的にスケーリングして、データ分析を高速化します。
比較項目 | ソリューション 1 | ソリューション 2 | ソリューション 3 |
リソースの隔離 | 排他的ストレージリソースと共有コンピューティングリソース。 | 排他的ストレージリソースと共有コンピューティングリソース。 | 排他的ストレージリソースとエラスティック専用リソースのサポート。 |
スケーリング | ストレージレイヤースケーリング。 | コンピューティングレイヤースケーリング。 | ストレージレイヤーとコンピューティングレイヤーの自動スケーリング。 |
O&M コスト | 手動操作が必要です。 | クエリはサブクエリに分割されます。 | 完全自動スケジューリング。 |
クエリの複雑さ | ネイティブ SQL サポート。 | カスタム開発が必要です。 | ネイティブ SQL サポート。 |
前提条件
標準ログストアが作成されていること。 詳細については、「ログストアを作成する」をご参照ください。
ログが収集されていること。 詳細については、「データ収集の概要」をご参照ください。
インデックスが構成されていること。 詳細については、「インデックスを構成する」をご参照ください。
手順
Simple Log Service では、次の方法に基づいて SQL 拡張を有効にできます。
1 回有効化:1 回有効化方式に基づいて SQL 拡張が有効化されると、現在のログストアのクエリ操作と分析操作のみが SQL 拡張を使用できます。
デフォルトで有効:デフォルトで有効方式に基づいて SQL 拡張が有効化されると、アラート関連操作やダッシュボード関連操作など、現在のプロジェクトのすべてのクエリ操作と分析操作で SQL 拡張を使用できます。
コンソール
1 回有効化
Simple Log Service コンソール にログオンします。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。

タブで、管理するログストアをクリックします。

を選択します。

デフォルトで有効
Simple Log Service コンソール にログオンします。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。

アイコンをクリックします。
[SQL 専用インスタンスの CU] にポインターを移動し、[変更] をクリックします。

[SQL 専用インスタンスの CU を変更] パネルで、[デフォルトで有効] をオンにして、[OK] をクリックします。
API
1 回有効化
GetLogs (クエリ結果は圧縮されずに直接返されます)
次のパラメーターのいずれか 1 つだけを構成する必要があります。
powerSql: 有効な値:true および false (デフォルト)。 値 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 (クエリ結果は圧縮されて返されます)
次のパラメーターのいずれか 1 つだけを構成する必要があります。
powerSql: 有効な値:true および false (デフォルト)。 値 true は、現在のクエリで SQL 拡張を使用することを指定します。 値 false は、現在のクエリで標準 SQL を使用することを指定します。query: この例では、* | select count(*) as pvクエリ文が実行されます。set session parallel_sql=true;を分析文に追加して、SQL 拡張が使用されることを示します。 クエリ文は* | set session parallel_sql=true; select count(*) as pvになります。
デフォルトで有効
CreateSqlInstance: この操作では、useAsDefault を true に設定して、プロジェクトの SQL 拡張を自動的に有効にします。
SDK
この例では、Java 用 Simple Log Service SDK を使用します。
前提条件
Java 用 Simple Log Service SDK がインストールされていること。 詳細については、「Java 用 Simple Log Service SDK をインストールする」をご参照ください。
1 回有効化
GetLogs() メソッド
次のパラメーターのいずれか 1 つだけを構成する必要があります。
powerSql: 有効な値:true および false (デフォルト)。 値 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 シークレットは環境変数から取得されます。 String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); // Simple Log Service エンドポイント。 この例では、中国 (杭州) リージョンの Simple Log Service エンドポイントが使用されます。 パラメーター値を実際のエンドポイントに置き換えます。 String host = "https://cn-beijing.log.aliyuncs.com"; // Simple Log Service クライアントを作成します。 Client client = new Client(host, accessId, accessKey); // プロジェクト名。 String projectName = "aliyun-project-test"; // ログストア名。 String logstore = "request_log"; // SQL 拡張を使用するかどうかを指定します。 デフォルト値:false。 boolean useAsDefault = true; // クエリ文を指定します。 String query = "* | select count(1)"; // リクエストに対して返すログの最大数。 このパラメーターは、query パラメーターが検索文に設定されている場合にのみ有効になります。 最小値:0。 最大値:100。 デフォルト値:100。 int line = 3; // クエリの開始行。 このパラメーターは、query パラメーターが検索文に設定されている場合にのみ有効になります。 デフォルト値:0。 int offset = 0; // ログのタイムスタンプの逆 chron 順にログを返すかどうかを指定します。 ログのタイムスタンプは分単位で正確です。 有効な値: // true: ログはログのタイムスタンプの逆 chron 順に返されます。 // false (デフォルト): ログはログのタイムスタンプの chron 順に返されます。 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, "", query, line, offset, reverse, powerSql); // "sql" should be "query" System.out.println(getLogsResponse.getCpuSec()); } }
デフォルトで有効
boolean useAsDefault を true に設定して、プロジェクトの 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 シークレットは環境変数から取得されます。
String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// プロジェクト名。
String projectName = "aliyun-test-project";
// Simple Log Service エンドポイント。 この例では、中国 (杭州) リージョンの Simple Log Service エンドポイントが使用されます。 パラメーター値を実際のエンドポイントに置き換えます。
String host = "https://cn-beijing.log.aliyuncs.com";
// Simple Log Service クライアントを作成します。
Client client = new Client(host, accessId, accessKey);
int cu = 100;
boolean useAsDefault = true;
client.createSqlInstance(new CreateOrUpdateSqlInstanceRequest(projectName, cu, useAsDefault));
}
}詳細については、「Python SDK で専用 SQL を使用する」をご参照ください。
詳細については、「Node.js SDK で専用 SQL を使用する」をご参照ください。
詳細については、「PHP SDK で専用 SQL を使用する」をご参照ください。
詳細については、「C++ SDK で専用 SQL を使用する」をご参照ください。
FAQ
使用した CPU 時間の量はどのように取得しますか?
分析操作とクエリ操作を実行した後、[分析結果] にポインターを移動すると、使用した CPU 時間の量を確認できます。 次の図は例を示しています。

クエリ文を 1 回実行した場合の専用 SQL 機能の料金はいくらですか?
専用 SQL 機能の料金は、クエリ文を実行するデータ量によって異なります。 次の表に例を示します。
クエリ文
データ量 (行)
実行ごとの平均コスト (USD)
* | select avg(double_0) from stress_s1_mil140億
0.004435
* | select avg(double_0), sum(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 拡張]