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.
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:
-
Öffnen Sie die Amazon QLDB-Konsole unter https://console.aws.amazon.com/qldb.
-
Wählen Sie im Navigationsbereich PartiQL-Editor aus.
-
Wählen Sie ein Ledger aus der Dropdown-Liste der Ledger aus.
-
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.
-
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:
-
Wählen Sie im Navigationsbereich unter PartiQL-Editor die Option Letzte Abfragen aus.
-
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;
});
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;
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')
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.
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.
Gehen Sie wie folgt vor, um die Timing-Informationen einer Anweisung mithilfe der QLDB-Konsole abzurufen:
-
Öffnen Sie die Amazon QLDB-Konsole unter https://console.aws.amazon.com/qldb.
-
Wählen Sie im Navigationsbereich PartiQL-Editor aus.
-
Wählen Sie ein Ledger aus der Dropdown-Liste der Ledger aus.
-
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.
-
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:
-
Wählen Sie im Navigationsbereich unter PartiQL-Editor die Option Letzte Abfragen aus.
-
In der Spalte Ausführungszeit (ms) werden diese Zeitinformationen für jede Anweisung angezeigt.
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;
});
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;
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')
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.