Use a sintaxe EXPLAIN para inspecionar como o Lindorm SQL executa uma consulta. Os planos de consulta revelam o método de varredura de dados, a seleção de índice, as operações relacionais e o comportamento de push-down. Isso oferece visibilidade sobre as ações do mecanismo de consulta, permitindo diagnosticar problemas e ajustar o desempenho.
Os planos de consulta são compatíveis com LindormTable e LindormTSDB.
Como funciona
Ao receber uma consulta, o Lindorm SQL analisa o código SQL em uma árvore de sintaxe abstrata, reescreve-o em um plano lógico e aplica otimizações baseadas em regras ou custos para gerar um plano físico. O plano físico é a versão que realmente executa a operação: ele especifica quais operadores rodam no Lindorm SQL e quais operações sofrem push-down para o mecanismo de armazenamento.
O comando EXPLAIN permite inspecionar o plano em três níveis de profundidade:
|
Profundidade |
Quando usar |
|
Plano físico (padrão) |
Diagnosticar problemas de desempenho: verifique qual índice foi selecionado, o intervalo de varredura e a ordem das operações |
|
Plano lógico |
Depurar questões semânticas: inspecione como o Lindorm SQL reescreve sua consulta antes da otimização |
|
Plano de tipos |
Verificar tipos de colunas: confirme o esquema de saída sem executar um plano completo |
Níveis de profundidade do plano de consulta
Plano lógico
O plano lógico exibe a estrutura da consulta após a reescrita, mas antes da otimização. O Lindorm SQL o gera a partir da árvore de sintaxe abstrata e pode aplicar reescritas como:
Substituir uma expressão constante pelo valor calculado
Substituir
AVGpelas expressões equivalentesSUMeCOUNT
Use EXPLAIN WITHOUT IMPLEMENTATION FOR para visualizar o plano lógico:
EXPLAIN WITHOUT IMPLEMENTATION FOR
SELECT LOCATE('9378', p1) AS lp, COUNT(c1)
FROM (SELECT * FROM test WHERE p1 LIKE '3_%')
GROUP BY lp
ORDER BY lp;
Saída:
********************* 1. row *********************
PLAN: LogicalSort(sort0=[$0], dir0=[ASC])
LogicalAggregate(group=[{0}], EXPR$1=[COUNT($1)])
LogicalProject(lp=[LOCATE('9378', $0)], c1=[$1])
LogicalFilter(condition=[LIKE($0, '3_%')])
LindormTableScan(table=[[db, test]])
Para consultar a sintaxe completa do EXPLAIN, consulte EXPLAIN.
Plano físico
O plano físico representa a versão otimizada e executável da consulta. O otimizador seleciona o melhor modo de execução com base em políticas de regras ou custos. Esta é a saída padrão do comando EXPLAIN e mostra o caminho completo de execução: quais operadores rodam no Lindorm SQL, quais operações sofrem push-down para o LindormTable ou LindormTSDB, o índice escolhido, o intervalo de varredura e as condições de filtro.
Use EXPLAIN FOR (ou apenas EXPLAIN) para visualizar o plano físico:
EXPLAIN
SELECT LOCATE('9378', p1) AS lp, COUNT(c1)
FROM (SELECT * FROM test WHERE p1 LIKE '3_%')
GROUP BY lp
ORDER BY lp;
Saída:
********************* 1. row *********************
PLAN: EnumerableSort(sort0=[$0], dir0=[ASC])
EnumerableAggregate(group=[{0}], EXPR$1=[COUNT($1)])
EnumerableCalc(expr#0..3=[{inputs}], expr#4=['9378'], expr#5=[LOCATE($t4, $t0)], lp=[$t5], c1=[$t1])
EnumerableLindormDirectQuery(
explanation=[SELECT p1,c1,c2,c3 from test where ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%)) supportEmptyResult true
Candidate tables:
Data table: test, scores=1..0..1, need query back=false, sort type=FORWARD
Chose data table [test].
---
SELECT p1,c1,c2,c3 from test supportEmptyResult true
SingleScan on test
ranges: [3\x00, 4\x00]
filter: ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%))
])
Plano de tipos
O plano de tipos contém apenas os tipos das colunas de saída para cada coluna no conjunto de resultados. Ele é gerado com base nos tipos da consulta e aplica-se a cenários específicos. Por ser o mais leve entre os três níveis de profundidade, é útil para verificar rapidamente o esquema de saída sem inspecionar toda a árvore de execução.
Use EXPLAIN WITH TYPE FOR para visualizar o plano de tipos:
EXPLAIN WITH TYPE FOR
SELECT LOCATE('9378', p1) AS lp, COUNT(c1)
FROM (SELECT * FROM test WHERE p1 LIKE '3_%')
GROUP BY lp
ORDER BY lp;
Saída:
********************* 1. row *********************
PLAN: lp INTEGER NOT NULL,
EXPR$1 BIGINT NOT NULL
Para obter a sintaxe completa do EXPLAIN, consulte EXPLAIN.
Operadores nos planos de consulta
Os operadores constituem os blocos fundamentais de um plano físico. Cada um representa uma etapa distinta na execução da consulta. O Lindorm SQL inclui operadores de uso geral para computação e um conjunto de operadores estendidos para push-down e operações específicas do mecanismo.
Operadores de uso geral
Estes operadores lidam com operações de computação executadas no Lindorm SQL, como classificação, agregação, projeção e cálculo.
EnumerableLimit
Ignora e trunca o conjunto de resultados com base nos valores de OFFSET e LIMIT. A saída do plano indica a origem dos valores de offset e fetch.
Quando aparece: Em qualquer consulta com cláusula LIMIT ou OFFSET.
EnumerableSort
Classifica o conjunto de resultados conforme a cláusula ORDER BY utilizando um algoritmo de ordenação baseado em treemap. A saída do plano mostra a chave de ordenação e a direção.
Quando aparece: Em consultas com ORDER BY nas quais a ordenação não pode ser atendida pela ordem de varredura da camada de armazenamento. Se EnumerableSort surgir no seu plano, adicionar um índice correspondente à coluna de ordenação pode eliminar esse operador.
EnumerableAggregate
Agrega linhas retornadas por operadores de nível inferior usando funções de agregação e colunas de agrupamento opcionais. Também processa a sintaxe DISTINCT. A saída do plano exibe a chave de agrupamento e as expressões de agregação.
Quando aparece: Em consultas com GROUP BY, funções de agregação (COUNT, SUM, AVG, etc.) ou DISTINCT.
EnumerableCalc
Avalia expressões — operações aritméticas, funções escalares (exceto funções de agregação e de janela) — e realiza projeção e filtragem nas linhas. Trata-se de um operador de computação de uso geral.
Quando aparece: Em consultas que aplicam expressões ou filtros sem push-down para o mecanismo de armazenamento.
Operadores estendidos
EnumerableLindormDirectQuery
Marca a parte da consulta que sofreu push-down para execução no mecanismo de armazenamento. O campo explanation descreve o que foi enviado via push-down e como o mecanismo de armazenamento processou a solicitação. O conteúdo de explanation varia conforme o mecanismo:
LindormTable
|
Campo |
Descrição |
|
Candidate tables |
Índices candidatos avaliados, com suas respectivas pontuações |
|
Chose data table |
Índice selecionado para a consulta |
|
Scan type |
Método de varredura (por exemplo, |
|
ranges |
Intervalo de chaves percorrido na varredura |
|
filter |
Condições de filtro aplicadas durante a varredura |
LindormTSDB
O campo explanation contém os parâmetros da chamada de API do LindormTSDB invocada para a consulta.
Operadores estendidos para LindormTSDB
Estes operadores são específicos para consultas do LindormTSDB.
TSDBDataScanRel
Uma variante de LogicalTableScan que executa operações de varredura de métricas. A saída do plano inclui:
filter— condições de filtro aplicadas à varreduraproject— mapeamento de colunas entre o operador e a tabela de séries temporaishint— hints transmitidos junto com a varredura, como_l_series_only
Quando aparece: Em qualquer consulta que leia dados de uma tabela de métricas do LindormTSDB.
TSDBShowTagRel
Otimiza consultas que recuperam todos os valores de uma coluna de tag específica, equivalente à sintaxe SHOW TAG VALUES do InfluxDB. Este operador surge no nível mais baixo da árvore do plano e indica que o mecanismo de armazenamento lida diretamente com a enumeração de tags.
Quando aparece: Exclusivamente em consultas no formato SELECT DISTINCT <tagkey column> FROM <table>.
TSDBAggScanRel
Operador combinado que une EnumerableAggregation e TSDBDataScanRel em uma única etapa de push-down para agregar dados de séries temporais.
Quando aparece: Em consultas que agregam dados de séries temporais quando tanto a varredura quanto a agregação podem sofrer push-down para o LindormTSDB.
EnumerableDownsampleQuery
Processa consultas que utilizam a sintaxe SAMPLE BY, uma extensão do Lindorm SQL para reduzir a amostragem (downsampling) de dados de séries temporais no LindormTSDB. Como SAMPLE BY é um dialeto SQL não padrão, possui seu próprio operador lógico (LogicalDownsampleQuery) e operador físico (EnumerableDownsampleQuery). A saída do plano inclui:
project— mapeamento de colunas entre o operador e o plano de nível superiorfilter— condições de filtro enviadas via push-down junto com a operação de downsamplingds_agg— função de downsampling e seus parâmetrosaggregator— operadores de agregação enviados via push-down para agregação entre séries temporaishint— hints enviados via push-down para o LindormTSDB
Quando aparece: Apenas em consultas que usam a sintaxe SAMPLE BY.
Próximos passos
EXPLAIN — referência completa de sintaxe para todas as variantes do
EXPLAIN