Utilice la sintaxis EXPLAIN para inspeccionar cómo Lindorm SQL ejecuta una consulta. Los planes de consulta revelan el método de escaneo de datos, la selección de índices, las operaciones relacionales y el comportamiento de push-down. Esto le ofrece una visión clara de lo que hace el motor de consultas para que pueda diagnosticar problemas y ajustar el rendimiento.
Los planes de consulta son compatibles con LindormTable y LindormTSDB.
Funcionamiento
Cuando Lindorm SQL recibe una consulta, analiza el código SQL y genera un árbol de sintaxis abstracta. Luego lo reescribe como un plan lógico y aplica optimizaciones basadas en reglas o en costos para producir un plan físico. El plan físico es el que realmente se ejecuta; especifica qué operadores se procesan en Lindorm SQL y qué operaciones se delegan al motor de almacenamiento mediante push-down.
EXPLAIN le permite inspeccionar el plan en tres niveles de profundidad:
|
Nivel |
Cuándo utilizarlo |
|
Plan físico (predeterminado) |
Para diagnosticar problemas de rendimiento: compruebe qué índice se seleccionó, el rango de escaneo y el orden de las operaciones |
|
Plan lógico |
Para depurar problemas semánticos: inspeccione cómo Lindorm SQL reescribe su consulta antes de la optimización |
|
Plan de tipos |
Para verificar los tipos de columna: confirme el esquema de salida sin ejecutar un plan completo |
Niveles de profundidad del plan de consulta
Plan lógico
El plan lógico muestra la estructura de la consulta después de la reescritura y antes de la optimización. Lindorm SQL lo genera a partir del árbol de sintaxis abstracta y puede aplicar reescrituras como:
Sustitución de una expresión constante por su valor calculado
Sustitución de
AVGpor expresiones equivalentes deSUMyCOUNT
Utilice EXPLAIN WITHOUT IMPLEMENTATION FOR para consultar el plan 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;
Salida:
********************* 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 la sintaxis completa de EXPLAIN, consulte EXPLAIN.
Plan físico
El plan físico es la versión optimizada y ejecutable de la consulta. El optimizador selecciona el mejor modo de ejecución según directivas basadas en reglas o en costos. Esta es la salida predeterminada de EXPLAIN y muestra la ruta de ejecución completa: qué operadores se ejecutan en Lindorm SQL, qué operaciones se delegan a LindormTable o LindormTSDB, el índice elegido, el rango de escaneo y las condiciones de filtro.
Utilice EXPLAIN FOR (o simplemente EXPLAIN) para consultar el plan 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;
Salida:
********************* 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_%))
])
Plan de tipos
El plan de tipos contiene únicamente los tipos de datos de cada columna en el conjunto de resultados. Se genera con base en los tipos de la consulta y aplica en escenarios específicos. Es el nivel más ligero de los tres y resulta útil para verificar rápidamente el esquema de salida sin inspeccionar todo el árbol de ejecución.
Utilice EXPLAIN WITH TYPE FOR para consultar el plan 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;
Salida:
********************* 1. row *********************
PLAN: lp INTEGER NOT NULL,
EXPR$1 BIGINT NOT NULL
Para consultar la sintaxis completa de EXPLAIN, consulte EXPLAIN.
Operadores en los planes de consulta
Los operadores son los componentes básicos de un plan físico. Cada operador representa un paso discreto en la ejecución de la consulta. Lindorm SQL incluye operadores de propósito general para cómputo y un conjunto de operadores extendidos para operaciones push-down y específicas del motor.
Operadores de propósito general
Estos operadores gestionan las operaciones de cómputo que se ejecutan en Lindorm SQL: ordenamiento, agregación, proyección y cálculo.
EnumerableLimit
Omite y trunca el conjunto de resultados según los valores de OFFSET y LIMIT. La salida del plan muestra el origen de los valores de offset y fetch.
Cuándo aparece: En cualquier consulta con una cláusula LIMIT o OFFSET.
EnumerableSort
Ordena el conjunto de resultados según la cláusula ORDER BY mediante un algoritmo de ordenamiento basado en treemap. La salida del plan muestra la clave de ordenamiento y la dirección.
Cuándo aparece: En consultas con ORDER BY donde el ordenamiento no puede resolverse con el orden de escaneo de la capa de almacenamiento. Si EnumerableSort aparece en su plan, agregar un índice que coincida con la columna de ordenamiento podría eliminar este operador.
EnumerableAggregate
Agrega las filas devueltas por operadores de nivel inferior mediante funciones de agregación y columnas de agrupamiento opcionales. También gestiona la sintaxis DISTINCT. La salida del plan muestra la clave de agrupamiento y las expresiones de agregación.
Cuándo aparece: En consultas con GROUP BY, funciones de agregación (COUNT, SUM, AVG, etc.) o DISTINCT.
EnumerableCalc
Evalúa expresiones (operaciones aritméticas, funciones escalares, excepto funciones de agregación y de ventana) y realiza proyecciones y filtrados en las filas. Es un operador de cómputo de propósito general.
Cuándo aparece: En consultas que aplican expresiones o filtros que no se delegan al motor de almacenamiento.
Operadores extendidos
EnumerableLindormDirectQuery
Marca la parte de la consulta que se delega al motor de almacenamiento para su ejecución. El campo explanation describe qué se delegó y cómo lo procesó el motor de almacenamiento. El contenido de explanation varía según el motor:
LindormTable
|
Campo |
Descripción |
|
Candidate tables |
Índices candidatos evaluados, con sus puntuaciones |
|
Chose data table |
Índice seleccionado para la consulta |
|
Scan type |
Método de escaneo (por ejemplo, |
|
ranges |
Rango de claves escaneado |
|
filter |
Condiciones de filtro aplicadas durante el escaneo |
LindormTSDB
El campo explanation contiene los parámetros de la llamada a la API de LindormTSDB invocada para la consulta.
Operadores extendidos para LindormTSDB
Estos operadores son específicos de las consultas de LindormTSDB.
TSDBDataScanRel
Es una variante de LogicalTableScan que realiza operaciones de escaneo de métricas. La salida del plan incluye:
filter— condiciones de filtro aplicadas al escaneoproject— mapeo de columnas entre el operador y la tabla de series temporaleshint— sugerencias pasadas junto con el escaneo, como_l_series_only
Cuándo aparece: En cualquier consulta que lee desde una tabla de métricas de LindormTSDB.
TSDBShowTagRel
Optimiza consultas que recuperan todos los valores de una columna de etiqueta específica; equivale a la sintaxis SHOW TAG VALUES de InfluxDB. Este operador aparece en el nivel más bajo del árbol del plan e indica que la enumeración de etiquetas la gestiona directamente el motor de almacenamiento.
Cuándo aparece: Solo en consultas con la forma SELECT DISTINCT <tagkey column> FROM <table>.
TSDBAggScanRel
Es un operador combinado que fusiona EnumerableAggregation y TSDBDataScanRel en un solo paso push-down para agregar datos de series temporales.
Cuándo aparece: En consultas que agregan datos de series temporales cuando tanto el escaneo como la agregación pueden delegarse a LindormTSDB.
EnumerableDownsampleQuery
Gestiona consultas que usan la sintaxis SAMPLE BY, una extensión de Lindorm SQL para reducir la frecuencia de muestreo de datos de series temporales en LindormTSDB. Dado que SAMPLE BY es un dialecto SQL no estándar, cuenta con su propio operador lógico (LogicalDownsampleQuery) y operador físico (EnumerableDownsampleQuery). La salida del plan incluye:
project— mapeo de columnas entre el operador y el plan de nivel superiorfilter— condiciones de filtro delegadas junto con la operación de reducción de muestreods_agg— función de reducción de muestreo y sus parámetrosaggregator— operadores de agregación delegados para la agregación entre series temporaleshint— sugerencias delegadas a LindormTSDB
Cuándo aparece: Solo en consultas que utilizan la sintaxis SAMPLE BY.
Pasos siguientes
EXPLAIN — referencia completa de sintaxis para todas las variantes de
EXPLAIN