SQL 強化は、ストレージリソースとコンピューティングリソースを自動的にスケーリングすることで、Simple Log Service (SLS) でのクエリと分析を高速化します。
仕組み
背景情報
SLS は、ストレージとコンピューティングを分離しています。シャードベースのストレージレイヤーがデータの保存と管理を担い、コンピューティングレイヤーは SQL を使用してクエリと分析を実行します。
分析パフォーマンスを向上させるには、両方のレイヤーを強化できます。以下のセクションでは、一般的なソリューションを比較します。
ソリューション 1:シャードの分割
手動でシャードを分割することで、ストレージ容量を拡張し、コンピューティングスループットを向上させます。
制限事項:
-
この方法は、新しく書き込まれるデータにのみ適用されます。
-
アクティブなシャードには料金が発生します。詳細については、「課金」をご参照ください。
-
単一のクエリには、同時実行数とデータ量による制限があります。
-
シャードの分割またはマージを手動で行う必要があります。
ソリューション 2:分割統治によるクエリ
大規模なクエリを複数のサブクエリに分割し、結果を集計します。
制限事項:
-
二次集計ロジックと中間ストレージの維持が必要です。これにはスケジュールされた SQL を使用してください。
-
分析ディメンションを変更する場合、集計ロジックを再構築する必要があります。
-
非常に大規模なデータ量では、コンピューティングのボトルネックが依然として発生する可能性があります。
ソリューション 3:SQL 強化の使用
SQL 強化は、データ量に基づいてストレージリソースとコンピューティングリソースを自動的にスケーリングすることで、分析を高速化します。
|
比較項目 |
ソリューション 1:シャードの分割 |
ソリューション 2:分割統治によるクエリ |
ソリューション 3:SQL 強化の使用 |
|
リソース分離 |
独立したストレージリソース、共有コンピューティングリソース |
独立したストレージリソース、共有コンピューティングリソース |
独立したストレージリソースと伸縮自在な専用コンピューティングリソース |
|
スケーリングの粒度 |
ストレージレイヤーのスケーリング |
コンピューティングレイヤーのスケーリング |
ストレージレイヤーとコンピューティングレイヤー両方での伸縮自在なスケーリング |
|
メンテナンスのオーバーヘッド |
手動での介入が必要です。 |
大規模なクエリをサブクエリに分割する必要があります。 |
完全に自動化されたスケジューリングです。 |
|
クエリの複雑さ |
ネイティブ SQL をサポートします。 |
カスタム開発が必要です。 |
ネイティブ SQL をサポートします。 |
前提条件
標準のLogstoreが作成されます。 詳細については、基本的な Logstore の作成をご参照ください。
ログが収集されていること。 詳細については、「データ収集の概要」をご参照ください。
インデックスが設定されます。 詳細は、「インデックスの設定」をご参照ください。
手順
次のいずれかの方法で SQL 強化を有効にします。
-
単一のクエリに対して有効化:Logstore 内の現在のクエリにのみ適用されます。
-
デフォルトで有効化:アラートやダッシュボードを含む、プロジェクト内のすべてのクエリに適用されます。
コンソール
単一のクエリに対して有効化
Log Serviceコンソールにログインします。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。
タブで、管理するログストアをクリックします。
-
をクリックします。
デフォルトで有効化
Log Serviceコンソールにログインします。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。
-
アイコンをクリックします。上部メニューの [ホーム] アイコンをクリックすると、プロジェクト一覧に戻るか、プロジェクトを切り替えることができます。
-
SQL 専用インスタンスの CU にカーソルを合わせ、設定 をクリックします。
-
SQL 専用インスタンスの CU の変更 パネルで、デフォルトで有効化 スイッチをオンにし、OK をクリックします。
API
単一のクエリに対して有効化
-
GetLogs (非圧縮結果を返す) - Logstore 内のログをクエリ
次のいずれかのパラメータを設定します。
-
powerSqlパラメータ:SQL 強化を使用する場合はtrueに、標準 SQL を使用する場合はfalse(デフォルト) に設定します。 -
queryパラメーター:SQL ステートメントの先頭にset session parallel_sql=true;を追加します。 たとえば、* | select count(*) as pvは* | set session parallel_sql=true; select count(*) as pvになります。
-
-
GetLogsV2 (圧縮結果を返す) - Logstore 内のログデータをクエリ
次のいずれかのパラメータを設定します。
-
powerSqlパラメータ:SQL 強化を使用する場合はtrueに、標準 SQL を使用する場合はfalse(デフォルト) に設定します。 -
queryパラメーター:SQL ステートメントの先頭にset session parallel_sql=true;を追加します。 たとえば、* | select count(*) as pvは* | set session parallel_sql=true; select count(*) as pvになります。
-
デフォルトで有効化
専用 SQL インスタンスの作成 API で、useAsDefault=true に設定すると、プロジェクトに対して SQL 強化がデフォルトで有効になります。
SDK
以下の例では Java SDK を使用します。
前提条件
単一のクエリに対して有効化
-
GetLogs() メソッド
次のいずれかのパラメータを設定します。
-
powerSqlパラメータ:SQL 強化を使用する場合はtrueに、標準 SQL を使用する場合はfalse(デフォルト) に設定します。 -
queryパラメーター:SQL ステートメントの先頭にset session parallel_sql=true;を追加します。 たとえば、* | select count(*) as pvは* | 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"); // SLS のエンドポイント。この例では中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントに置き換えてください。 String host = "https://cn-hangzhou.log.aliyuncs.com"; // SLS クライアントを作成します。 Client client = new Client(host, accessId, accessKey); // プロジェクト名。 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, "", query, line, offset, reverse, powerSql); System.out.println(getLogsResponse.getCpuSec()); } } -
デフォルトで有効化
プロジェクトの SQL 拡張をデフォルトで有効にするには、boolean useAsDefault = true に設定します。
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";
// SLS のエンドポイント。この例では中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントに置き換えてください。
String host = "https://cn-hangzhou.log.aliyuncs.com";
// SLS クライアントを作成します。
Client client = new Client(host, accessId, accessKey);
int cu = 100;
boolean useAsDefault = true;
client.createSqlInstance(new CreateOrUpdateSqlInstanceRequest(projectName, cu, useAsDefault));
}
}
よくある質問
-
CPU 時間を確認する方法は?
クエリを実行した後、分析結果 にマウスポインターを合わせると、CPU 時間を表示できます。 右上の統計パネルにある [消費 CPU 時間] フィールドに、消費された CPU 時間が秒単位で表示されます。
-
専用 SQL クエリのコスト
コストはデータ量とクエリの複雑さによって異なります。次の表に例を示します。
クエリステートメント
データ量 (行)
1 回の実行あたりのコスト (USD)
* | 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