PartiQL ステートメントの統計の取得 - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

PartiQL ステートメントの統計の取得

Amazon QLDB は、より効率的な PartiQL ステートメントを実行して、QLDB の使用を最適化する際に役立つステートメント実行の統計を提供します。QLDB は、ステートメントの結果と共にこれらの統計を返します。これには、消費された I/O 使用量とサーバー側の処理時間を定量化するメトリクスが含まれており、非効率的なステートメントを特定するために使用できます。

この機能は現在、すべてのサポートされている言語において、QLDB コンソールQLDB シェル、最新バージョンの QLDB ドライバーの PartiQL エディタで使用できます。コンソールでクエリ履歴のステートメント統計を表示することもできます。

I/O 使用量

I/O 使用量のメトリクスは、読み取り I/O リクエストの数を示します。読み取り I/O リクエストの数が予想よりも多い場合は、インデックスがないなど、ステートメントが最適化されていないことを示します。前のトピック「クエリパフォーマンスの最適化」の「最適なクエリパターン」を確認することをお勧めします。

注記

空でないテーブルで CREATE INDEX ステートメントを実行した場合、I/O 使用量メトリクスには、同期インデックス作成呼び出しの読み取りリクエストのみが含まれます。

QLDB は、テーブル内の既存のドキュメントのインデックスを非同期的に構築します。これらの非同期読み取りリクエストは、ステートメント結果からの I/O 使用量メトリクスには含まれません。非同期読み取りリクエストは個別に課金され、インデックスの構築が完了した後に読み取り I/O の合計に追加されます。

QLDB コンソールの使用

QLDB コンソールを使用してステートメントの読み取り I/O 使用量を取得するには、次のステップを実行します。

  1. Amazon QLDB コンソール (https://console.aws.amazon.com/qldb) を開きます。

  2. ナビゲーションペイン内で [PartiQL エディタ] を選択します。

  3. 台帳のドロップダウンリストから台帳を選択します。

  4. クエリエディタウィンドウで、選択したステートメントを入力し、[Run] (実行) を選択します。以下はクエリの例です。

    SELECT * FROM testTable WHERE firstName = 'Jim'

    ステートメントを実行するには、キーボードショートカット Ctrl+Enter (Windows の場合) または Cmd+Return (macOS の場合) を使用することもできます。キーボードショートカットの詳細については、「PartiQL エディタのキーボードショートカット」を参照してください。

  5. クエリエディタウィンドウの下に、クエリ結果にはステートメントによって行われた読み取りリクエストの数である read I/Os が含まれます。

次のステップを実行して、クエリ履歴の読み取り I/O を表示することもできます。

  1. ナビゲーションペインで、[PartiQL エディタ][最近のクエリ] を選択します。

  2. [Read I/Os] (読み取り I/O) 列には、各ステートメントによって行われた読み取りリクエストの数が表示されます。

QLDB ドライバーの使用

QLDB ドライバーを使用してステートメントの I/O 使用量を取得するには、結果のストリームカーソルまたはバッファ済みカーソルの getConsumedIOs オペレーションを呼び出します。

次のコード例は、読み取り I/O をステートメント結果のストリームカーソルから取得する方法を示します。

Java
import com.amazon.ion.IonSystem; import com.amazon.ion.IonValue; import com.amazon.ion.system.IonSystemBuilder; import software.amazon.qldb.IOUsage; import software.amazon.qldb.Result; IonSystem ionSystem = IonSystemBuilder.standard().build(); IonValue ionFirstName = ionSystem.newString("Jim"); driver.execute(txn -> { Result result = txn.execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); for (IonValue ionValue : result) { // User code here to handle results } IOUsage ioUsage = result.getConsumedIOs(); long readIOs = ioUsage.getReadIOs(); });
.NET
using Amazon.IonDotnet.Builders; using Amazon.IonDotnet.Tree; using Amazon.QLDB.Driver; using IAsyncResult = Amazon.QLDB.Driver.IAsyncResult; // This is one way of creating Ion values. We can also use a ValueFactory. // For more details, see: https://docs.aws.amazon.com/qldb/latest/developerguide/driver-cookbook-dotnet.html#cookbook-dotnet.ion IIonValue ionFirstName = IonLoader.Default.Load("Jim"); await driver.Execute(async txn => { IAsyncResult result = await txn.Execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); // Iterate through stream cursor to accumulate read IOs. await foreach (IIonValue ionValue in result) { // User code here to handle results. // Warning: It is bad practice to rely on results within a lambda block, unless // it is to check the state of a result. This is because lambdas are retryable. } var ioUsage = result.GetConsumedIOs(); var readIOs = ioUsage?.ReadIOs; });
注記

同期コードに変換するには、awaitasync のキーワードを削除して、IAsyncResult 型を IResult に変更します。

Go
import ( "context" "fmt" "github.com/awslabs/amazon-qldb-driver-go/v2/qldbdriver" ) driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT * FROM testTable WHERE firstName = ?", "Jim") if err != nil { panic(err) } for result.Next(txn) { // User code here to handle results } ioUsage := result.GetConsumedIOs() readIOs := *ioUsage.GetReadIOs() fmt.Println(readIOs) return nil,nil })
Node.js
import { IOUsage, ResultReadable, TransactionExecutor } from "amazon-qldb-driver-nodejs"; await driver.executeLambda(async (txn: TransactionExecutor) => { const result: ResultReadable = await txn.executeAndStreamResults("SELECT * FROM testTable WHERE firstName = ?", "Jim"); for await (const chunk of result) { // User code here to handle results } const ioUsage: IOUsage = result.getConsumedIOs(); const readIOs: number = ioUsage.getReadIOs(); });
Python
def get_read_ios(transaction_executor): cursor = transaction_executor.execute_statement("SELECT * FROM testTable WHERE firstName = ?", "Jim") for row in cursor: # User code here to handle results pass consumed_ios = cursor.get_consumed_ios() read_ios = consumed_ios.get('ReadIOs') qldb_driver.execute_lambda(lambda txn: get_read_ios(txn))

次のコード例は、読み取り I/O をステートメント結果のバッファ済みカーソルから取得する方法を示します。これは、ExecuteStatementFetchPage リクエストから読み取り I/O の合計を返します。

Java
import com.amazon.ion.IonSystem; import com.amazon.ion.IonValue; import com.amazon.ion.system.IonSystemBuilder; import software.amazon.qldb.IOUsage; import software.amazon.qldb.Result; IonSystem ionSystem = IonSystemBuilder.standard().build(); IonValue ionFirstName = ionSystem.newString("Jim"); Result result = driver.execute(txn -> { return txn.execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); }); IOUsage ioUsage = result.getConsumedIOs(); long readIOs = ioUsage.getReadIOs();
.NET
using Amazon.IonDotnet.Builders; using Amazon.IonDotnet.Tree; using Amazon.QLDB.Driver; using IAsyncResult = Amazon.QLDB.Driver.IAsyncResult; IIonValue ionFirstName = IonLoader.Default.Load("Jim"); IAsyncResult result = await driver.Execute(async txn => { return await txn.Execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); }); var ioUsage = result.GetConsumedIOs(); var readIOs = ioUsage?.ReadIOs;
注記

同期コードに変換するには、awaitasync のキーワードを削除して、IAsyncResult 型を IResult に変更します。

Go
import ( "context" "fmt" "github.com/awslabs/amazon-qldb-driver-go/v2/qldbdriver" ) result, err := driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT * FROM testTable WHERE firstName = ?", "Jim") if err != nil { return nil, err } return txn.BufferResult(result) }) if err != nil { panic(err) } qldbResult := result.(*qldbdriver.BufferedResult) ioUsage := qldbResult.GetConsumedIOs() readIOs := *ioUsage.GetReadIOs() fmt.Println(readIOs)
Node.js
import { IOUsage, Result, TransactionExecutor } from "amazon-qldb-driver-nodejs"; const result: Result = await driver.executeLambda(async (txn: TransactionExecutor) => { return await txn.execute("SELECT * FROM testTable WHERE firstName = ?", "Jim"); }); const ioUsage: IOUsage = result.getConsumedIOs(); const readIOs: number = ioUsage.getReadIOs();
Python
cursor = qldb_driver.execute_lambda( lambda txn: txn.execute_statement("SELECT * FROM testTable WHERE firstName = ?", "Jim")) consumed_ios = cursor.get_consumed_ios() read_ios = consumed_ios.get('ReadIOs')
注記

ストリームカーソルは、結果セットをページ分割するため、ステートフルです。したがって、getConsumedIOsgetTimingInformation オペレーションは、呼び出す時間以降の蓄積されたメトリクスを返します。

バッファ済みカーソルは、結果セットをメモリにバッファリングし、蓄積されたメトリクスの合計を返します。

タイミング情報

タイミング情報メトリクスは、サーバー側の処理時間をミリ秒単位で表します。サーバー側の処理時間は、QLDB がステートメントの処理に費やす期間として定義されます。これには、ネットワーク呼び出しや一時停止にかかる時間は含まれません。このメトリクスは、QLDB サービス側の処理時間とクライアント側の処理時間を区別します。

QLDB コンソールの使用

QLDB コンソールを使用してステートメントのタイミング情報を取得するには、次のステップを実行します。

  1. Amazon QLDB コンソール (https://console.aws.amazon.com/qldb) を開きます。

  2. ナビゲーションペイン内で [PartiQL エディタ] を選択します。

  3. 台帳のドロップダウンリストから台帳を選択します。

  4. クエリエディタウィンドウで、選択したステートメントを入力し、[Run] (実行) を選択します。以下はクエリの例です。

    SELECT * FROM testTable WHERE firstName = 'Jim'

    ステートメントを実行するには、キーボードショートカット Ctrl+Enter (Windows の場合) または Cmd+Return (macOS の場合) を使用することもできます。キーボードショートカットの詳細については、「PartiQL エディタのキーボードショートカット」を参照してください。

  5. クエリエディタウィンドウの下のクエリ結果には、QLDB がステートメントリクエストを受信してからレスポンスを送信するまでの時間であるサーバー側のレイテンシーが含まれます。これはクエリ時間全体のサブセットです。

次のステップを実行して、クエリ履歴のタイミング情報を表示することもできます。

  1. ナビゲーションペインで、[PartiQL エディタ][最近のクエリ] を選択します。

  2. [実行時間 (ms)] 列には、各ステートメントのこのタイミング情報が表示されます。

QLDB ドライバーの使用

QLDB ドライバーを使用してステートメントのタイミング情報を取得するには、結果のストリームカーソルまたはバッファ済みカーソルの getTimingInformation オペレーションを呼び出します。

次のコード例は、処理時間をステートメント結果のストリームカーソルから取得する方法を示します。

Java
import com.amazon.ion.IonSystem; import com.amazon.ion.IonValue; import com.amazon.ion.system.IonSystemBuilder; import software.amazon.qldb.Result; import software.amazon.qldb.TimingInformation; IonSystem ionSystem = IonSystemBuilder.standard().build(); IonValue ionFirstName = ionSystem.newString("Jim"); driver.execute(txn -> { Result result = txn.execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); for (IonValue ionValue : result) { // User code here to handle results } TimingInformation timingInformation = result.getTimingInformation(); long processingTimeMilliseconds = timingInformation.getProcessingTimeMilliseconds(); });
.NET
using Amazon.IonDotnet.Builders; using Amazon.IonDotnet.Tree; using Amazon.QLDB.Driver; using IAsyncResult = Amazon.QLDB.Driver.IAsyncResult; IIonValue ionFirstName = IonLoader.Default.Load("Jim"); await driver.Execute(async txn => { IAsyncResult result = await txn.Execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); // Iterate through stream cursor to accumulate processing time. await foreach(IIonValue ionValue in result) { // User code here to handle results. // Warning: It is bad practice to rely on results within a lambda block, unless // it is to check the state of a result. This is because lambdas are retryable. } var timingInformation = result.GetTimingInformation(); var processingTimeMilliseconds = timingInformation?.ProcessingTimeMilliseconds; });
注記

同期コードに変換するには、awaitasync のキーワードを削除して、IAsyncResult 型を IResult に変更します。

Go
import ( "context" "fmt" "github.com/awslabs/amazon-qldb-driver-go/v2/qldbdriver" ) driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT * FROM testTable WHERE firstName = ?", "Jim") if err != nil { panic(err) } for result.Next(txn) { // User code here to handle results } timingInformation := result.GetTimingInformation() processingTimeMilliseconds := *timingInformation.GetProcessingTimeMilliseconds() fmt.Println(processingTimeMilliseconds) return nil, nil })
Node.js
import { ResultReadable, TimingInformation, TransactionExecutor } from "amazon-qldb-driver-nodejs"; await driver.executeLambda(async (txn: TransactionExecutor) => { const result: ResultReadable = await txn.executeAndStreamResults("SELECT * FROM testTable WHERE firstName = ?", "Jim"); for await (const chunk of result) { // User code here to handle results } const timingInformation: TimingInformation = result.getTimingInformation(); const processingTimeMilliseconds: number = timingInformation.getProcessingTimeMilliseconds(); });
Python
def get_processing_time_milliseconds(transaction_executor): cursor = transaction_executor.execute_statement("SELECT * FROM testTable WHERE firstName = ?", "Jim") for row in cursor: # User code here to handle results pass timing_information = cursor.get_timing_information() processing_time_milliseconds = timing_information.get('ProcessingTimeMilliseconds') qldb_driver.execute_lambda(lambda txn: get_processing_time_milliseconds(txn))

次のコード例は、処理時間をステートメント結果のバッファ済みカーソルから取得する方法を示します。これは、ExecuteStatementFetchPage リクエストから処理時間の合計を返します。

Java
import com.amazon.ion.IonSystem; import com.amazon.ion.IonValue; import com.amazon.ion.system.IonSystemBuilder; import software.amazon.qldb.Result; import software.amazon.qldb.TimingInformation; IonSystem ionSystem = IonSystemBuilder.standard().build(); IonValue ionFirstName = ionSystem.newString("Jim"); Result result = driver.execute(txn -> { return txn.execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); }); TimingInformation timingInformation = result.getTimingInformation(); long processingTimeMilliseconds = timingInformation.getProcessingTimeMilliseconds();
.NET
using Amazon.IonDotnet.Builders; using Amazon.IonDotnet.Tree; using Amazon.QLDB.Driver; using IAsyncResult = Amazon.QLDB.Driver.IAsyncResult; IIonValue ionFirstName = IonLoader.Default.Load("Jim"); IAsyncResult result = await driver.Execute(async txn => { return await txn.Execute("SELECT * FROM testTable WHERE firstName = ?", ionFirstName); }); var timingInformation = result.GetTimingInformation(); var processingTimeMilliseconds = timingInformation?.ProcessingTimeMilliseconds;
注記

同期コードに変換するには、awaitasync のキーワードを削除して、IAsyncResult 型を IResult に変更します。

Go
import ( "context" "fmt" "github.com/awslabs/amazon-qldb-driver-go/v2/qldbdriver" ) result, err := driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) { result, err := txn.Execute("SELECT * FROM testTable WHERE firstName = ?", "Jim") if err != nil { return nil, err } return txn.BufferResult(result) }) if err != nil { panic(err) } qldbResult := result.(*qldbdriver.BufferedResult) timingInformation := qldbResult.GetTimingInformation() processingTimeMilliseconds := *timingInformation.GetProcessingTimeMilliseconds() fmt.Println(processingTimeMilliseconds)
Node.js
import { Result, TimingInformation, TransactionExecutor } from "amazon-qldb-driver-nodejs"; const result: Result = await driver.executeLambda(async (txn: TransactionExecutor) => { return await txn.execute("SELECT * FROM testTable WHERE firstName = ?", "Jim"); }); const timingInformation: TimingInformation = result.getTimingInformation(); const processingTimeMilliseconds: number = timingInformation.getProcessingTimeMilliseconds();
Python
cursor = qldb_driver.execute_lambda( lambda txn: txn.execute_statement("SELECT * FROM testTable WHERE firstName = ?", "Jim")) timing_information = cursor.get_timing_information() processing_time_milliseconds = timing_information.get('ProcessingTimeMilliseconds')
注記

ストリームカーソルは、結果セットをページ分割するため、ステートフルです。したがって、getConsumedIOsgetTimingInformation オペレーションは、呼び出す時間以降の蓄積されたメトリクスを返します。

バッファ済みカーソルは、結果セットをメモリにバッファリングし、蓄積されたメトリクスの合計を返します。

システムカタログをクエリする方法については、システムカタログのクエリの実行 に進みます。