Obtener estadísticas de instrucciones PartiQL - Amazon Quantum Ledger Database (Amazon QLDB)

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Obtener estadísticas de instrucciones PartiQL

Amazon QLDB proporciona estadísticas de ejecución de declaraciones que pueden ayudarle a optimizar el uso de QLDB mediante la ejecución de sentencias partiQL más eficientes. QLDB devuelve estas estadísticas junto con los resultados de la declaración. Incluyen métricas que cuantifican el uso de E/S consumido y el tiempo de procesamiento del lado del servidor, lo que le permite identificar declaraciones ineficientes.

Esta característica está disponible actualmente en laEditor PartiQLen elConsola QLDB, elShell QLDB, y la versión más reciente delControlador QLDBpara todos los idiomas compatibles. También puede ver las estadísticas de extractos del historial de consultas en la consola de.

Uso de E/S

La métrica de uso de E/S describe el número de solicitudes de E/S de lectura. Si el número de solicitudes de E/S de lectura es superior al esperado, indica que la instrucción no está optimizada, como la falta de un índice. Le recomendamos que revisePatrones de consulta óptimosen el tema anterior,Optimización del rendimiento de consultas.

nota

Cuando dirijas unCREATE INDEXen una tabla no vacía, la métrica de uso de E/S incluye solicitudes de lectura para la llamada de creación de índice síncrona únicamente.

QLDB crea el índice de cualquier documento existente de la tabla de forma asíncrona. Estas solicitudes de lectura asíncronas no se incluyen en la métrica de uso de E/S de los resultados de la declaración. Las solicitudes de lectura asíncronas se cobran por separado y se añaden al total de E/S de lectura después de completar la compilación del índice.

Mediante la consola QLDB

Para obtener el uso de E/S de lectura de una declaración mediante la consola QLDB, siga estos pasos:

  1. Abra la consola de Amazon QLDB enhttps://console.aws.amazon.com/qldb.

  2. En el panel de navegación, elijaEditor PartiQL.

  3. Seleccione un libro mayor de la lista desplegable de libros mayores.

  4. En la ventana del editor de consultas, introduzca cualquier declaración de su elección y, a continuación, elijaEjecución de. A continuación se muestra un ejemplo de consulta.

    SELECT * FROM testTable WHERE firstName = 'Jim'

    Para ejecutar una instrucción, también puede utilizar el método abreviado de tecladoCtrl+Enteren Windows, oCmd+Returnpara macOS. Para obtener más métodos abreviados de teclado, consulteAtajos de teclado del editor PartiQL.

  5. Debajo de la ventana del editor de consultas, los resultados de la consulta incluyen:lectura de E/S, que es el número de solicitudes de lectura que se hicieron en la declaración.

También puede ver las E/S leídas del historial de consultas siguiendo los siguientes pasos:

  1. En el panel de navegación, elijaConsultas recientesUNDEREditor PartiQL.

  2. LaE/S de lecturamuestra el número de solicitudes de lectura realizadas por cada declaración.

Uso del controlador QLDB

Para obtener el uso de E/S de una declaración mediante el controlador QLDB, llame algetConsumedIOsfuncionamiento del cursor de flujo del resultado o del cursor con búfer.

En los siguientes ejemplos de código se muestra cómo obtener E/S de lectura desde elcursor de transmisióndel resultado de una declaración.

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

Para convertir en código síncrono, elimine elawaityasyncpalabras clave y cambie laIAsyncResultescriba aIResult.

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

En los siguientes ejemplos de código se muestra cómo obtener E/S de lectura desde elcursor en búferdel resultado de una declaración. Devuelve el total de E/S de lectura deExecuteStatementyFetchPagesolicitudes.

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

Para convertir en código síncrono, elimine elawaityasyncpalabras clave y cambie laIAsyncResultescriba aIResult.

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

El cursor de flujo tiene estado porque pagina el conjunto de resultados. Por lo tanto, elgetConsumedIOsygetTimingInformationlas operaciones devuelven las métricas acumuladas desde el momento en que las llama.

El cursor en búfer almacena en búfer el conjunto de resultados en la memoria y devuelve el total de métricas acumuladas.

Información de cronometraje

La métrica de información de temporización describe el tiempo de procesamiento del lado del servidor en milisegundos. El tiempo de procesamiento del lado del servidor se define como la cantidad de tiempo que QLDB dedica al procesamiento de una declaración. Esto no incluye el tiempo empleado en las llamadas de red o las pausas. Esta métrica desambigua el tiempo de procesamiento en el lado del servicio QLDB desde el tiempo de procesamiento del lado del cliente.

Mediante la consola QLDB

Para obtener información de temporización de una declaración mediante la consola QLDB, siga estos pasos:

  1. Abra la consola de Amazon QLDB enhttps://console.aws.amazon.com/qldb.

  2. En el panel de navegación, elijaEditor PartiQL.

  3. Seleccione un libro mayor de la lista desplegable de libros mayores.

  4. En la ventana del editor de consultas, introduzca cualquier declaración de su elección y, a continuación, elijaEjecución de. A continuación se muestra un ejemplo de consulta.

    SELECT * FROM testTable WHERE firstName = 'Jim'

    Para ejecutar una instrucción, también puede utilizar el método abreviado de tecladoCtrl+Enteren Windows, oCmd+Returnpara macOS. Para obtener más métodos abreviados de teclado, consulteAtajos de teclado del editor PartiQL.

  5. Debajo de la ventana del editor de consultas, los resultados de la consulta incluyen:latencia del lado del servidor, que es el periodo de tiempo que transcurre entre el momento en que QLDB recibió la solicitud de extracto y el momento en que envió la respuesta. Este es un subconjunto de la duración total de la consulta.

También puede ver la información de temporización del historial de consultas siguiendo los siguientes pasos:

  1. En el panel de navegación, elijaConsultas recientesUNDEREditor PartiQL.

  2. LaTiempo de ejecución (ms)muestra esta información de temporización de cada sentencia.

Uso del controlador QLDB

Para obtener información de sincronización de una declaración mediante el controlador QLDB, llame algetTimingInformationfuncionamiento del cursor de flujo del resultado o del cursor con búfer.

En los siguientes ejemplos de código se muestra cómo obtener el tiempo de procesamiento delcursor de transmisióndel resultado de una declaración.

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

Para convertir en código síncrono, elimine elawaityasyncpalabras clave y cambie laIAsyncResultescriba aIResult.

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

En los siguientes ejemplos de código se muestra cómo obtener el tiempo de procesamiento delcursor en búferdel resultado de una declaración. Devuelve el tiempo total de procesamiento deExecuteStatementyFetchPagesolicitudes.

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

Para convertir en código síncrono, elimine elawaityasyncpalabras clave y cambie laIAsyncResultescriba aIResult.

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

El cursor de flujo tiene estado porque pagina el conjunto de resultados. Por lo tanto, elgetConsumedIOsygetTimingInformationlas operaciones devuelven las métricas acumuladas desde el momento en que las llama.

El cursor en búfer almacena en búfer el conjunto de resultados en la memoria y devuelve el total de métricas acumuladas.

Para obtener información sobre cómo consultar el catálogo del sistema, continúe enConsulta del catálogo de sistemas.