slow_query_clinic.sql en SQL
Un reporte escrito de tres formas: subconsulta correlacionada, join y función de ventana.
-- La misma respuesta de tres maneras. Los planes son la parte interesante.
-- 1. Subconsulta correlacionada: legible, y corre una vez por cliente.
EXPLAIN QUERY PLAN
SELECT
c.name,
(
SELECT ROUND(SUM(o.total), 2)
FROM orders AS o
WHERE o.customer_id = c.id
AND o.status = 'paid'
) AS revenue
FROM customers AS c
ORDER BY revenue DESC;
-- 2. Agregar una vez y luego unir. Una sola pasada sobre orders.
EXPLAIN QUERY PLAN
WITH totals AS (
SELECT
customer_id,
ROUND(SUM(total), 2) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
)
SELECT
c.name,
t.revenue
FROM customers AS c
JOIN totals AS t
ON t.customer_id = c.id
ORDER BY t.revenue DESC;
-- 3. Una ventana conserva el detalle por pedido junto al total del cliente.
EXPLAIN QUERY PLAN
SELECT
c.name,
o.id AS order_id,
o.total,
ROUND(
SUM(o.total) OVER (
PARTITION BY o.customer_id
),
2
) AS customer_revenue,
ROUND(
o.total * 100.0 / SUM(o.total) OVER (
PARTITION BY o.customer_id
),
1
) AS pct_of_customer
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id
WHERE o.status = 'paid'
ORDER BY c.name, o.placed_at;
Cómo funciona
- La forma correlacionada corre su subconsulta una vez por fila de la consulta externa.
- La forma con join y agrupación calcula cada total una sola vez.
- La forma con ventana obtiene el total y el detalle de la fila en una pasada.
Palabras clave y builtins usados aquí
ANDASBYDESCEXPLAINFROMGROUPJOINONORDERSELECTSUMWHEREWITHc
El intento, en números
- Líneas
- 56
- Caracteres a escribir
- 1093
- Tokens
- 218
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 131 segundos.
Paso 2 de 2 en Bis; paso 17 de 17 en Planes y rendimiento.