typestar

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

  1. sqlite_master guarda el DDL de cada índice que creaste.
  2. index_list e index_xinfo reportan las columnas, en orden.
  3. Un índice que ningún plan menciona es un costo de escritura sin lector.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 2 en Bis; paso 16 de 17 en Planes y rendimiento.

← Anterior Siguiente →