このトピックでは、SQL の完全正確モードの実装と有効化手順について説明します。これにより、SQL のコア機能を効率的に使用できます。
制限事項
SQL の完全正確モードを有効にすると、次の機能は使用できなくなります。
実装
完全正確モードでは、時間とリソースをトレードオフすることで、正確かつ完全な結果を保証します。さまざまなリソースの制約を時間次元に変換することにより、クエリタスクは、ユーザーが指定した時間範囲内で安全な負荷レベルで安定して実行され、結果が正確になるか、実行がタイムアウトするまで継続されます。技術的な実装では、分離されたリソースプールに基づくタスク割り当て、ユーザーのキュー優先順位制御、計算集中型や IO 集中型などのタスクタイプに基づく負荷分割など、複数の戦略が採用されています。これらの戦略により、合理的なスケジューリングとリソースの効率的な利用が効果的に実現され、最終結果の精度が保証されます。
通常のクエリタスクはオンデマンドの計算リソースプールで実行されます。クエリタスクがリソース制限に達すると、クエリタスクは自動的に終了し、不正確な結果が返されます。SQL の完全正確モードを有効にすると、クエリタスクは専用の正確な計算リソースプールで実行されます。システムは、リソース制限に達した場合でも、すべてのデータが読み込まれ、正確な計算が完了するまで、クエリタスクが安全な負荷レベルで安定して実行されるようにします。
前提条件
標準ログストアが作成されていること。詳細については、「ログストアを作成する」をご参照ください。
ログが収集されていること。詳細については、「データ収集の概要」をご参照ください。
インデックスが構成されていること。詳細については、「インデックスを構成する」をご参照ください。
手順
Simple Log Service は、一度有効化するとその設定が保持されるメソッドをサポートしています。完全正確モードが有効になると、現在のログストアのクエリ操作と分析操作のみがそのモードを使用できます。
API または SDK を使用するか、Simple Log Service コンソールで、完全正確モードの最大タイムアウト期間を設定できます。分析操作の最大タイムアウト期間は 55 秒です。
コンソール
Simple Log Service コンソール にログインします。
[プロジェクト] セクションで、目的のプロジェクトをクリックします。
タブで、目的のログストアをクリックします。
を選択します。
重要query_max_run_time
パラメーターを構成して、最大タイムアウト期間を変更できます。この例では、
* | select count(*) as pv
クエリ文が指定されています。set session query_max_run_time=10s;
を分析文に追加すると、クエリ文は* | set session query_max_run_time=10s; select count(*) as pv
になります。
API
GetLogs (クエリ結果は圧縮されずに直接返されます)
パラメーター:
query
この例では、
* | select count(*) as pv
クエリ文が実行されます。完全正確モードを有効にする:
set session allow_incomplete=false;
を分析文に追加します。これは、完全正確モードが使用されることを示します。クエリ文は* | set session allow_incomplete=false; select count(*) as pv
になります。最大タイムアウト期間を指定する:
set session query_max_run_time=10s;
を分析文に追加します。これは、最大タイムアウト期間が10 秒
であることを示します。クエリ文は* | set session query_max_run_time=10s; select count(*) as pv
になります。完全正確モードを有効にし、最大タイムアウト期間を指定する: クエリ文は
* | set session allow_incomplete=false; set session query_max_run_time=10s;select count(*) as pv
になります。
GetLogsV2 (クエリ結果は圧縮されて返されます)
パラメーター:
query
この例では、
* | select count(*) as pv
クエリ文が実行されます。完全正確モードを有効にする:
set session allow_incomplete=false;
を分析文に追加します。これは、完全正確モードが使用されることを示します。クエリ文は* | set session allow_incomplete=false; select count(*) as pv
になります。最大タイムアウト期間を指定する:
set session query_max_run_time=10s;
を分析文に追加します。これは、最大タイムアウト期間が10 秒
であることを示します。クエリ文は* | set session query_max_run_time=10s; select count(*) as pv
になります。完全正確モードを有効にし、最大タイムアウト期間を指定する: クエリ文は
* | set session allow_incomplete=false; set session query_max_run_time=10s;select count(*) as pv
になります。
SDK
この例では、Java 用の Simple Log Service SDK を使用します。
前提条件
Java 用 Simple Log Service SDK がインストールされていること。詳細については、「Java 用 Simple Log Service SDK をインストールする」をご参照ください。
GetLogs() メソッド
パラメーター:
query
この例では、
* | select count(*) as pv
クエリ文が実行されます。完全正確モードを有効にする:
set session allow_incomplete=false;
を分析文に追加します。これは、完全正確モードが使用されることを示します。クエリ文は* | set session allow_incomplete=false; select count(*) as pv
になります。最大タイムアウト期間を指定する:
set session query_max_run_time=10s;
を分析文に追加します。これは、最大タイムアウト期間が10 秒
であることを示します。クエリ文は* | set session query_max_run_time=10s; select count(*) as pv
になります。完全正確モードを有効にし、最大タイムアウト期間を指定する: クエリ文は
* | set session allow_incomplete=false; set session query_max_run_time=10s;select count(*) as pv
になります。
パラメーター:
session
完全正確モードを有効にする:
request.SetSession("allow_incomplete=false");
。最大タイムアウト期間を指定する:
request.SetSession("query_max_run_time=10s");
。完全正確モードを有効にし、最大タイムアウト期間を指定する:
request.SetSession("allow_incomplete=false;query_max_run_time=10s")
。
import com.aliyun.openservices.log.Client; import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.request.GetLogsRequest; import com.aliyun.openservices.log.response.GetLogsResponse; public class CrearteLogStore { 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-test-project"; // ログストア名。 String logstore = "request_log"; String query = "* | SELECT count(0)"; int from = (int)(System.currentTimeMillis()/1000) - 60; int to = (int)(System.currentTimeMillis()/1000); GetLogsRequest request = new GetLogsRequest(projectName, logstore, from, to, "", query); request.SetSession("allow_incomplete=false;query_max_run_time=10s"); GetLogsResponse response = client.GetLogs(request); System.out.println(response.getCpuSec()); } }
よくある質問
使用した CPU 時間を取得するにはどうすればよいですか。
分析操作とクエリ操作を実行した後、[分析結果] にポインターを移動して、使用した CPU 時間を表示します。次の図は例を示しています。
クエリ文を 1 回実行する場合、専用 SQL 機能の料金はいくらですか。
専用 SQL 機能の料金は、クエリ文を実行するデータ量によって異なります。次の表に例を示します。
クエリ文
データ量 (行数)
実行ごとの平均コスト (USD)
* | select avg(double_0) from stress_s1_mil1
40億
0.004435
* | select avg(double_0), sum(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