index_review.sql en SQL
Preguntarle a la base qué índices tiene, cuáles usa y cuáles solo está pagando.
-- Auditoría de índices: qué existe, qué cubre, qué hace el planificador.
CREATE INDEX IF NOT EXISTS orders_by_customer_date
ON orders (customer_id, placed_at DESC);
CREATE INDEX IF NOT EXISTS orders_by_status
ON orders (status);
ANALYZE;
-- Cada índice del esquema, con la sentencia que lo creó.
SELECT
tbl_name AS table_name,
name AS index_name,
CASE
WHEN sql IS NULL THEN 'implicit (PRIMARY KEY or UNIQUE)'
ELSE sql
END AS definition
FROM sqlite_master
WHERE type = 'index'
ORDER BY tbl_name, name;
-- Lo que el planificador ahora cree sobre su selectividad.
SELECT
tbl AS table_name,
idx AS index_name,
stat AS rows_and_buckets
FROM sqlite_stat1
ORDER BY tbl, idx;
-- Las columnas dentro de un índice, en el orden del índice.
PRAGMA index_list('orders');
PRAGMA index_xinfo('orders_by_customer_date');
-- Tres consultas, tres planes. Lee cada uno contra la lista de arriba.
EXPLAIN QUERY PLAN
SELECT id
FROM orders
WHERE customer_id = 7;
EXPLAIN QUERY PLAN
SELECT id
FROM orders
WHERE status = 'paid'
ORDER BY placed_at DESC;
EXPLAIN QUERY PLAN
SELECT
c.name,
SUM(o.total) AS revenue
FROM customers AS c
JOIN orders AS o
ON o.customer_id = c.id
GROUP BY c.id
ORDER BY revenue DESC
LIMIT 10;
Cómo funciona
sqlite_masterguarda el DDL de cada índice que creaste.index_listeindex_xinforeportan las columnas, en orden.- Un índice que ningún plan menciona es un costo de escritura sin lector.
Palabras clave y builtins usados aquí
ANALYZEASBYCASECREATEDESCELSEENDEXISTSEXPLAINFROMGROUPIFINDEXISJOINLIMITNOTNULLONORDERSELECTSUMTHENWHENWHEREcsqltable_nametype
El intento, en números
- Líneas
- 57
- Caracteres a escribir
- 1204
- Tokens
- 171
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 103 segundos.
Paso 1 de 2 en Bis; paso 16 de 17 en Planes y rendimiento.