Descifra el plan que el planificador de SQLite elige realmente para tus consultas con EXPLAIN QUERY PLAN.
Abrir esta lección en KodokonSQL es declarativo: describes el resultado, no cómo obtenerlo. Es el planificador de consultas el que decide cómo leer los datos. Para verlo trabajar, SQLite ofrece dos comandos: EXPLAIN QUERY PLAN da un plan legible de alto nivel, mientras que EXPLAIN a secas vuelca el bytecode de la máquina virtual VDBE. Instala la herramienta de línea de comandos sqlite3, o abre sqliteonline.com en tu navegador, y reproduce cada ejemplo que sigue.
CREATE TABLE departments (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
department_id INTEGER,
salary INTEGER NOT NULL
);
INSERT INTO departments (id, name) VALUES
(1, 'Engineering'),
(2, 'Sales');
INSERT INTO employees
(id, name, department_id, salary)
VALUES
(1, 'Ada', 1, 65000),
(2, 'Grace', 1, 72000),
(3, 'Alan', 2, 58000);Coloca EXPLAIN QUERY PLAN delante de cualquier consulta SELECT. Cada línea del resultado describe cómo se lee una tabla. Dos palabras clave dominan: SCAN significa que la tabla se recorre por completo, fila por fila, mientras que SEARCH indica un acceso dirigido guiado por un índice. Sin un índice adecuado, incluso una simple igualdad ya provoca un recorrido completo.
EXPLAIN QUERY PLAN
SELECT * FROM employees
WHERE department_id = 1;
-- Result: SCAN employees
-- (no index: the whole table is read)Crea un índice sobre la columna filtrada y vuelve a ejecutar exactamente la misma consulta: el plan pasa de SCAN a SEARCH ... USING INDEX. Otras menciones también son valiosas: USE TEMP B-TREE revela una ordenación o agrupación materializada en memoria (a menudo señal de que falta un índice de ordenación), y USING COVERING INDEX indica que la tabla ni siquiera se abrió.
CREATE INDEX idx_emp_dept
ON employees (department_id);
EXPLAIN QUERY PLAN
SELECT * FROM employees
WHERE department_id = 1;
-- SEARCH employees USING INDEX
-- idx_emp_dept (department_id=?)EXPLAIN QUERY PLAN en comparación con EXPLAIN a secas?SCAN employees?ANALYZE?sqlite_stat1 para guiar al planificador