typestar

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

  1. La forma correlacionada corre su subconsulta una vez por fila de la consulta externa.
  2. La forma con join y agrupación calcula cada total una sola vez.
  3. La forma con ventana obtiene el total y el detalle de la fila en una pasada.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

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

← Anterior