Saltar a contenido

SA3 · Ejercicios de rendimiento

Todos los ejercicios usan la tabla pedidos de la página A3.1 (50 000 filas). Créala primero con este script; en cada ejercicio la base de datos parte de cero. Escribe tú toda la solución, incluidas las sentencias de preparación. Los nombres de los índices se indican en el enunciado, porque aparecen en el plan.

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
  fecha      TEXT    NOT NULL
);
WITH RECURSIVE n(i) AS (SELECT 1 UNION ALL SELECT i + 1 FROM n WHERE i < 50000)
INSERT INTO pedidos
SELECT i,
       (i * 7919) % 2000 + 1,
       CASE i % 4 WHEN 0 THEN 'café' WHEN 1 THEN 'té' WHEN 2 THEN 'zumo' ELSE 'tarta' END,
       (i * 31) % 90 + 10,
       date('2024-01-01', '+' || (i % 365) || ' days')
FROM n;

Ejercicio SA3.1

Un índice por cliente. Crea un índice llamado idx_pedidos_cliente sobre id_cliente y muestra el plan de ejecución de SELECT * FROM pedidos WHERE id_cliente = 42. Debe aparecer una búsqueda con el índice, no un recorrido de la tabla.

Resultado esperado:

id parent notused detail
3 0 61 SEARCH pedidos USING INDEX idx_pedidos_cliente (id_cliente=?)

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
-- ... (resto de la solución bloqueado)

Ejercicio SA3.2

Un índice compuesto. Crea un índice llamado idx_cliente_fecha sobre (id_cliente, fecha) y muestra el plan de ejecución de SELECT * FROM pedidos WHERE id_cliente = 42 AND fecha >= '2024-06-01'. El plan debe usar las dos columnas del índice.

Resultado esperado:

id parent notused detail
3 0 51 SEARCH pedidos USING INDEX idx_cliente_fecha (id_cliente=? AND fecha>?)

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
-- ... (resto de la solución bloqueado)

Ejercicio SA3.3

Un índice de cobertura. Crea un índice llamado idx_cliente_importe sobre (id_cliente, importe) y muestra el plan de ejecución de SELECT SUM(importe) FROM pedidos WHERE id_cliente = 42. El plan debe indicar que se resuelve solo con el índice.

Resultado esperado:

id parent notused detail
3 0 53 SEARCH pedidos USING COVERING INDEX idx_cliente_importe (id_cliente=?)

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
-- ... (resto de la solución bloqueado)

Ejercicio SA3.4

Los pedidos de marzo, bien escrito. Crea un índice llamado idx_pedidos_fecha sobre fecha y cuenta cuántos pedidos hay en marzo de 2024 (pedidos_de_marzo) con una condición que pueda usar el índice (nada de funciones sobre la columna).

Resultado esperado:

pedidos_de_marzo
4247

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
-- ... (resto de la solución bloqueado)

Ejercicio SA3.5

Las estadísticas de un índice. Crea un índice llamado idx_pedidos_cliente sobre id_cliente, ejecuta ANALYZE y muestra las columnas tbl, idx y stat de la tabla sqlite_stat1 solo para ese índice. Fíjate en cuántas filas hay de media por cliente.

Resultado esperado:

tbl idx stat
pedidos idx_pedidos_cliente 50000 25

1 fila

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
-- ... (resto de la solución bloqueado)

Ejercicio SA3.6

La página siguiente. Se han mostrado los pedidos hasta el id 40000 y el usuario pide la página siguiente de 5 pedidos. Muestra id, id_cliente e importe de esos 5 con paginación por clave (sin OFFSET), ordenados por id.

Resultado esperado:

id id_cliente importe
40001 1920 21
40002 1839 52
40003 1758 83
40004 1677 24
40005 1596 55

5 filas

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

CREATE TABLE pedidos (
  id         INTEGER PRIMARY KEY,
  id_cliente INTEGER NOT NULL,
  producto   TEXT    NOT NULL,
  importe    INTEGER NOT NULL,
-- ... (resto de la solución bloqueado)