Abrufen von PartiQL-Anweisungsstatistiken - Amazon Quantum Ledger Database (Amazon QLDB)

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Abrufen von PartiQL-Anweisungsstatistiken

Amazon QLDB bietet Statistiken zur Anweisungsausführung, die Ihnen helfen können, Ihre Verwendung von QLDB zu optimieren, indem Sie effizientere PartiQL-Anweisungen ausführen. QLDB gibt diese Statistiken zusammen mit den Ergebnissen der Anweisung zurück. Dazu gehören Metriken, die die verbrauchte I/O-Auslastung und die serverseitige Verarbeitungszeit quantifizieren. Anhand dieser Kennzahlen können Sie ineffiziente Aussagen identifizieren.

Diese Funktion ist derzeit im PartiQL-Editor auf der QLDB-Konsole, der QLDB-Shell und der neuesten Version des QLDB-Treibers für alle unterstützten Sprachen verfügbar. In der Konsole können Sie sich auch die Kontoauszugsstatistiken für Ihren Abfrageverlauf anzeigen lassen.

I/O-Nutzung

Die I/O-Nutzungsmetrik beschreibt die Anzahl der I/O-Lese-Anfragen. Wenn die Anzahl der I/O-Lese-Anfragen höher als erwartet ist, bedeutet dies, dass die Anweisung nicht optimiert ist, z. B. weil kein Index vorhanden ist. Wir empfehlen Ihnen, das vorherige Thema Optimieren der Abfrageleistung zu lesenOptimale Abfragemuster.

Anmerkung

Wenn Sie eineCREATE INDEX Anweisung für eine nicht leere Tabelle ausführen, enthält die I/O-Nutzungsmetrik nur Leseanforderungen für den Aufruf zur synchronen Indexerstellung.

QLDB erstellt den Index für alle vorhandenen Dokumente in der Tabelle asynchron. Diese asynchronen Leseanforderungen sind nicht in der I/O-Nutzungsmetrik Ihrer Abrechnungsergebnisse enthalten. Asynchrone Leseanforderungen werden separat berechnet und nach Abschluss der Indexerstellung zu Ihren gesamten Lese-I/Os hinzugerechnet.

Verwenden der QLDB-Konsole

Gehen Sie wie folgt vor, um die I/O-Nutzung einer Anweisung mithilfe der QLDB-Konsole abzurufen:

  1. Öffnen Sie die Amazon QLDB-Konsole unter https://console.aws.amazon.com/qldb.

  2. Wählen Sie im Navigationsbereich PartiQL-Editor aus.

  3. Wählen Sie ein Ledger aus der Dropdown-Liste der Ledger aus.

  4. Geben Sie im Fenster des Abfrage-Editors eine Anweisung Ihrer Wahl ein, und wählen Sie dann Ausführen. Das Folgende ist ein Abfragebeispiel.

    SELECT * FROM testTable WHERE firstName = 'Jim'

    Um eine Anweisung auszuführen, können Sie auch die TastenkombinationCtrl +Enter für Windows oderCmd +Return für macOS verwenden. Weitere Tastenkombinationen finden Sie unter Tastenkombinationen für den PartiQL-Editor.

  5. Unter dem Fenster des Abfrage-Editors enthalten Ihre Abfrageergebnisse Lese-I/Os. Dies ist die Anzahl der Leseanforderungen, die von der Anweisung gestellt wurden.

Sie können auch die gelesenen I/Os Ihres Abfrageverlaufs anzeigen, indem Sie die folgenden Schritte ausführen:

  1. Wählen Sie im Navigationsbereich unter PartiQL-Editor die Option Letzte Abfragen aus.

  2. In der Spalte Read I/Os wird die Anzahl der Leseanforderungen angezeigt, die von jeder Anweisung gestellt wurden.

Verwenden des QLDB-Treibers

Um die I/O-Nutzung einer Anweisung mithilfe des QLDB-Treibers abzurufen, rufen Sie diegetConsumedIOs Operation des Stream-Cursors oder des gepufferten Cursors des Ergebnisses auf.

In den folgenden Codebeispielen wird gezeigt, wie Sie gelesene I/Os aus dem Stream-Cursor eines Anweisungsergebnisses abrufen.

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; });
Anmerkung

Um in synchronen Code zu konvertieren, entfernen Sie dieasync Schlüsselwörterawait und und ändern Sie denIAsyncResult Typ inIResult.

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))

In den folgenden Codebeispielen wird gezeigt, wie Sie vom gepufferten Cursor eines Anweisungsergebnisses gelesene I/O abrufen. Dies gibt die Gesamtzahl der gelesenen I/Os vonExecuteStatement undFetchPage Anfragen zurück.

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;
Anmerkung

Um in synchronen Code zu konvertieren, entfernen Sie dieasync Schlüsselwörterawait und und ändern Sie denIAsyncResult Typ inIResult.

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')
Anmerkung

Der Stream-Cursor ist statusmäßig, da er die Ergebnismenge paginiert. Daher geben diegetTimingInformation OperationengetConsumedIOs und die kumulierten Metriken ab dem Zeitpunkt zurück, zu dem Sie sie aufrufen.

Der gepufferte Cursor puffert die Ergebnismenge im Speicher und gibt die gesamten akkumulierten Metriken zurück.

Informationen zum Zeitpunkt

Die Zeitinformationsmetrik beschreibt die serverseitige Verarbeitungszeit in Millisekunden. Die serverseitige Verarbeitungszeit ist definiert als die Zeit, die QLDB für die Verarbeitung einer Anweisung aufwendet. Dies enthält nicht die für Netzwerkanrufe oder Pausen aufgewendete Zeit. Diese Metrik unterscheidet die Verarbeitungszeit auf der QLDB-Serviceseite von der Verarbeitungszeit auf der Clientseite.

Verwenden der QLDB-Konsole

Gehen Sie wie folgt vor, um die Timing-Informationen einer Anweisung mithilfe der QLDB-Konsole abzurufen:

  1. Öffnen Sie die Amazon QLDB-Konsole unter https://console.aws.amazon.com/qldb.

  2. Wählen Sie im Navigationsbereich PartiQL-Editor aus.

  3. Wählen Sie ein Ledger aus der Dropdown-Liste der Ledger aus.

  4. Geben Sie im Fenster des Abfrage-Editors eine Anweisung Ihrer Wahl ein, und wählen Sie dann Ausführen. Das Folgende ist ein Abfragebeispiel.

    SELECT * FROM testTable WHERE firstName = 'Jim'

    Um eine Anweisung auszuführen, können Sie auch die TastenkombinationCtrl +Enter für Windows oderCmd +Return für macOS verwenden. Weitere Tastenkombinationen finden Sie unter Tastenkombinationen für den PartiQL-Editor.

  5. Unter dem Fenster des Abfrage-Editors enthalten Ihre Abfrageergebnisse die serverseitige Latenz. Dies ist die Zeitspanne zwischen dem Empfang der Anweisungsanforderung durch QLDB und dem Senden der Antwort. Dies ist ein Subset der gesamten Abfragedauer.

Sie können sich auch die Zeitinformationen Ihres Abfrageverlaufs anzeigen lassen, indem Sie die folgenden Schritte ausführen:

  1. Wählen Sie im Navigationsbereich unter PartiQL-Editor die Option Letzte Abfragen aus.

  2. In der Spalte Ausführungszeit (ms) werden diese Zeitinformationen für jede Anweisung angezeigt.

Verwenden des QLDB-Treibers

Um die Timing-Informationen einer Anweisung mithilfe des QLDB-Treibers abzurufen, rufen Sie diegetTimingInformation Operation des Stream-Cursors oder des gepufferten Cursors des Ergebnisses auf.

In den folgenden Codebeispielen wird gezeigt, wie sich die Verarbeitungszeit eines Anweisungsergebnisses aus dem Stream-Cursor holen.

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; });
Anmerkung

Um in synchronen Code zu konvertieren, entfernen Sie dieasync Schlüsselwörterawait und und ändern Sie denIAsyncResult Typ inIResult.

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))

In den folgenden Codebeispielen wird gezeigt, wie Sie die Verarbeitungszeit eines Anweisungsergebnisses aus dem gepufferten Cursor abrufen. Dies gibt die gesamte Verarbeitungszeit vonExecuteStatement undFetchPage Anfragen zurück.

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;
Anmerkung

Um in synchronen Code zu konvertieren, entfernen Sie dieasync Schlüsselwörterawait und und ändern Sie denIAsyncResult Typ inIResult.

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')
Anmerkung

Der Stream-Cursor ist statusmäßig, da er die Ergebnismenge paginiert. Daher geben diegetTimingInformation OperationengetConsumedIOs und die kumulierten Metriken ab dem Zeitpunkt zurück, zu dem Sie sie aufrufen.

Der gepufferte Cursor puffert die Ergebnismenge im Speicher und gibt die gesamten akkumulierten Metriken zurück.

Um zu erfahren, wie Sie den Systemkatalog abfragen, fahren Sie mit Abfragen des Systemkatalogs fort.