翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 使用量を取得するには、次のステップを実行します。
-
Amazon QLDB コンソール (https://console.aws.amazon.com/qldb) を開きます。
-
ナビゲーションペイン内で [PartiQL エディタ] を選択します。
-
台帳のドロップダウンリストから台帳を選択します。
-
クエリエディタウィンドウで、選択したステートメントを入力し、[Run] (実行) を選択します。以下はクエリの例です。
SELECT * FROM testTable WHERE firstName = 'Jim'
ステートメントを実行するには、キーボードショートカット Ctrl+Enter (Windows の場合) または Cmd+Return (macOS の場合) を使用することもできます。キーボードショートカットの詳細については、「PartiQL エディタのキーボードショートカット」を参照してください。
-
クエリエディタウィンドウの下に、クエリ結果にはステートメントによって行われた読み取りリクエストの数である read I/Os が含まれます。
次のステップを実行して、クエリ履歴の読み取り I/O を表示することもできます。
-
ナビゲーションペインで、[PartiQL エディタ] の [最近のクエリ] を選択します。
-
[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;
});
同期コードに変換するには、await
と async
のキーワードを削除して、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 をステートメント結果のバッファ済みカーソルから取得する方法を示します。これは、ExecuteStatement
と FetchPage
リクエストから読み取り 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;
同期コードに変換するには、await
と async
のキーワードを削除して、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')
ストリームカーソルは、結果セットをページ分割するため、ステートフルです。したがって、getConsumedIOs
と getTimingInformation
オペレーションは、呼び出す時間以降の蓄積されたメトリクスを返します。
バッファ済みカーソルは、結果セットをメモリにバッファリングし、蓄積されたメトリクスの合計を返します。
タイミング情報メトリクスは、サーバー側の処理時間をミリ秒単位で表します。サーバー側の処理時間は、QLDB がステートメントの処理に費やす期間として定義されます。これには、ネットワーク呼び出しや一時停止にかかる時間は含まれません。このメトリクスは、QLDB サービス側の処理時間とクライアント側の処理時間を区別します。
QLDB コンソールを使用してステートメントのタイミング情報を取得するには、次のステップを実行します。
-
Amazon QLDB コンソール (https://console.aws.amazon.com/qldb) を開きます。
-
ナビゲーションペイン内で [PartiQL エディタ] を選択します。
-
台帳のドロップダウンリストから台帳を選択します。
-
クエリエディタウィンドウで、選択したステートメントを入力し、[Run] (実行) を選択します。以下はクエリの例です。
SELECT * FROM testTable WHERE firstName = 'Jim'
ステートメントを実行するには、キーボードショートカット Ctrl+Enter (Windows の場合) または Cmd+Return (macOS の場合) を使用することもできます。キーボードショートカットの詳細については、「PartiQL エディタのキーボードショートカット」を参照してください。
-
クエリエディタウィンドウの下のクエリ結果には、QLDB がステートメントリクエストを受信してからレスポンスを送信するまでの時間であるサーバー側のレイテンシーが含まれます。これはクエリ時間全体のサブセットです。
次のステップを実行して、クエリ履歴のタイミング情報を表示することもできます。
-
ナビゲーションペインで、[PartiQL エディタ] の [最近のクエリ] を選択します。
-
[実行時間 (ms)] 列には、各ステートメントのこのタイミング情報が表示されます。
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;
});
同期コードに変換するには、await
と async
のキーワードを削除して、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))
次のコード例は、処理時間をステートメント結果のバッファ済みカーソルから取得する方法を示します。これは、ExecuteStatement
と FetchPage
リクエストから処理時間の合計を返します。
- 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;
同期コードに変換するには、await
と async
のキーワードを削除して、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')
ストリームカーソルは、結果セットをページ分割するため、ステートフルです。したがって、getConsumedIOs
と getTimingInformation
オペレーションは、呼び出す時間以降の蓄積されたメトリクスを返します。
バッファ済みカーソルは、結果セットをメモリにバッファリングし、蓄積されたメトリクスの合計を返します。
システムカタログをクエリする方法については、システムカタログのクエリの実行 に進みます。