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
QLDBA Amazon fornece estatísticas de execução de instruções que podem ajudá-lo a otimizar seu uso QLDB executando instruções partiQL mais eficientes. QLDBretorna essas estatísticas junto com os resultados da declaraçã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 recurso está disponível no editor partiQL no QLDBconsole, no QLDBshell e na versão mais recente do QLDBdriver 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.
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.
QLDBcria o índice para todos os documentos existentes 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.
Usar o console de QLDB
Para obter o uso de E/S de leitura de uma instrução usando o QLDB console, siga as seguintes etapas:
-
Abra o QLDB console da Amazon em https://console.aws.amazon.com/qldb.
-
No painel de navegação, selecione Editor PartiQL.
-
Escolha um ledger na lista suspensa.
-
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.
-
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:
-
No painel de navegação, escolha Consultas recentes no editor partiQL.
-
A coluna E/Ss de leitura exibe o número de solicitações de leitura feitas por cada instrução.
Usando o QLDB driver
Para obter o uso de E/S de uma instrução usando o QLDB driver, chame a getConsumedIOs
operação 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;
});
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;
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')
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.
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 QLDB gasto no processamento de uma declaraçã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 QLDB serviço do tempo de processamento no lado do cliente.
Para obter as informações de tempo de uma declaração usando o QLDB console, siga as seguintes etapas:
-
Abra o QLDB console da Amazon em https://console.aws.amazon.com/qldb.
-
No painel de navegação, selecione Editor PartiQL.
-
Escolha um ledger na lista suspensa.
-
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.
-
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 QLDB recebimento da 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:
-
No painel de navegação, escolha Consultas recentes no editor partiQL.
-
A coluna Tempo de execução (ms) exibe essas informações de tempo para cada instrução.
Para obter as informações de tempo de uma instrução usando o QLDB driver, chame a getTimingInformation
operação 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;
});
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;
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')
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 Consultar o catálogo do sistema.