Obter estatísticas de instruções PartiQL - Amazon Quantum Ledger Database (Amazon QLDB)

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Obter estatísticas de instruções PartiQL

Estatísticas de execução de instruções que podem ajudá-lo a otimizar seu uso do Amazon QLDB executando instruções partiQL mais eficientes. O QLDB retorna essas estatísticas junto com os resultados da instrução. Eles incluem métricas que quantificam o uso de E/S consumido e o tempo de processamento do lado do servidor, que você pode usar para identificar instruções ineficientes.

Atualmente, esse atributo está disponível no editor PartiQL no console do QLDB, no shell do QLDB e na versão mais recente do driver do QLDB para todas as linguagens suportadas. Você também pode visualizar estatísticas de instruções para seu histórico de consultas no console.

Uso de E/S

A métrica de uso de E/S descreve o número de solicitações de E/S de leitura. Se o número de solicitações de E/S de leitura for maior do que o esperado, isso indica que a instrução não está otimizada, como a falta de um índice. Recomendamos que você analise Padrões de consulta ideais no tópico anterior, Otimizar o desempenho da consulta.

nota

Quando você executa uma instrução CREATE INDEX em uma tabela não vazia, a métrica de uso de E/S inclui solicitações de leitura somente para a chamada de criação de índice síncrono.

O QLDB cria o índice para qualquer documento existente na tabela de forma assíncrona. Essas solicitações de leitura assíncrona não estão incluídas na métrica de uso de E/S dos resultados da sua declaração. As solicitações de leitura assíncrona são cobradas separadamente e adicionadas ao total de E/S de leitura após a conclusão da criação do índice.

Uso do console do QLDB

Para obter o uso de E/S de leitura de uma instrução usando o console QLDB, siga as etapas a seguir:

  1. Abra o console do Amazon QLDB em https://console.aws.amazon.com/qldb.

  2. No painel de navegação, selecione Editor PartiQL.

  3. Escolha um ledger na lista suspensa.

  4. Na janela do editor de consulta, insira a instrução de sua escolha e, em seguida, escolha Executar. Veja um exemplo de consulta a seguir:

    SELECT * FROM testTable WHERE firstName = 'Jim'

    Para executar a instrução, você também pode usar o atalho de teclado Ctrl+Enter para Windows ou Cmd+Return para macOS. Para obter mais atalhos de teclado, consulte Atalhos de teclado do editor PartiQL.

  5. Abaixo da janela do editor de consultas, os resultados da consulta incluem E/S de leitura, que é o número de solicitações de leitura feitas pela instrução.

Você também pode visualizar as I/Os de leitura do seu histórico de consultas seguindo as seguintes etapas:

  1. No painel de navegação, escolha Consultas recentes no editor partiQL.

  2. A coluna E/Ss de leitura exibe o número de solicitações de leitura feitas por cada instrução.

Usando o driver QLDB

Para obter o uso de E/S de uma instrução usando o driver QLDB, chame a operação getConsumedIOs do cursor de fluxo ou do cursor em buffer do resultado.

Os exemplos de código a seguir mostram como obter E/S lidas do cursor de fluxo do resultado de uma instruçã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; });
nota

Para converter em código síncrono, remova as palavras-chave await e async e altere o tipo IAsyncResult para 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))

Os exemplos de código a seguir mostram como obter E/S lidas do cursor de fluxo do resultado de uma instrução. Isso retorna o total de I/Os de leitura e solicitações ExecuteStatement e FetchPage.

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 converter em código síncrono, remova as palavras-chave await e async e altere o tipo IAsyncResult para 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')
nota

O cursor do stream tem estado porque pagina o conjunto de resultados. Portanto, as operações getConsumedIOs e getTimingInformation retornam as métricas acumuladas a partir do momento em que você as chama.

O cursor armazenado em buffer armazena em buffer o conjunto de resultados na memória e retorna o total de métricas acumuladas.

Informações de cronometragem

A métrica de informações de tempo descreve o tempo de processamento do lado do servidor em milissegundos. O tempo de processamento do lado do servidor é definido como a quantidade de tempo que o QLDB gasta no processamento de uma instrução. Isso não inclui o tempo gasto em chamadas ou pausas na rede. Essa métrica separa o tempo de processamento no lado do serviço QLDB do tempo de processamento no lado do cliente.

Uso do console do QLDB

Para obter informações sobre o tempo de uma instrução usando o console QLDB, siga as etapas a seguir:

  1. Abra o console do Amazon QLDB em https://console.aws.amazon.com/qldb.

  2. No painel de navegação, selecione Editor PartiQL.

  3. Escolha um ledger na lista suspensa.

  4. Na janela do editor de consulta, insira a instrução de sua escolha e, em seguida, selecione Executar. Veja um exemplo de consulta a seguir:

    SELECT * FROM testTable WHERE firstName = 'Jim'

    Para executar a instrução, você também pode usar o atalho de teclado Ctrl+Enter para Windows ou Cmd+Return para macOS. Para obter mais atalhos de teclado, consulte Atalhos de teclado do editor PartiQL.

  5. Abaixo da janela do editor de consultas, os resultados da consulta incluem latência do lado do servidor, que é a quantidade de tempo entre o momento em que o QLDB recebeu a solicitação de instrução e o envio da resposta. Esse é um subconjunto da duração total da consulta.

Você também pode visualizar as E/Ss de leitura do seu histórico de consultas seguindo as seguintes etapas:

  1. No painel de navegação, escolha Consultas recentes no editor partiQL.

  2. A coluna Tempo de execução (ms) exibe essas informações de tempo para cada instrução.

Usando o driver QLDB

Para obter o uso de E/S de uma instrução usando o driver QLDB, chame a operação getTimingInformation do cursor de fluxo ou do cursor em buffer do resultado.

Os exemplos de código a seguir mostram como obter E/S lidas do cursor de fluxo do resultado de uma instrução.

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 converter em código síncrono, remova as palavras-chave await e async e altere o tipo IAsyncResult para 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))

Os exemplos de código a seguir mostram como obter o tempo de processamento do cursor de fluxo do resultado de uma instrução. Isso retorna o total de processamento de solicitações ExecuteStatement e 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;
nota

Para converter em código síncrono, remova as palavras-chave await e async e altere o tipo IAsyncResult para 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')
nota

O cursor do stream tem estado porque pagina o conjunto de resultados. Portanto, as operações getConsumedIOs e getTimingInformation retornam as métricas acumuladas a partir do momento em que você as chama.

O cursor armazenado em buffer armazena em buffer o conjunto de resultados na memória e retorna o total de métricas acumuladas.

Para saber como consultar o catálogo do sistema, vá para Consultando o catálogo do sistema.