Si trabajas con bases de datos, tarde o temprano te enfrentarás a consultas lentas, tablas enormes y problemas de rendimiento difíciles de diagnosticar. La buena noticia: la mayoría de esos problemas no se deben a la base de datos, sino a cómo se escribe SQL.
En este artículo conocerás 12 buenas prácticas para optimizar consultas y escribir SQL profesional, usando ejemplos 100% compatibles con PostgreSQL, que puedes practicar directamente en db-fiddle.com.
1. Usa SELECT con columnas explícitas (evita SELECT *)
Cuando usas:
SELECT * FROM ventas; La base devuelve todas las columnas, incluso las que no necesitas. Esto:
- Aumenta el tráfico entre servidor y cliente
- Impide usar índices cubiertos
- Oculta si la tabla crece con nuevas columnas
En su lugar:
SELECT id_venta, fecha, total
FROM ventas; 2. Revisa tus JOIN: siempre especifica ON y evita combinaciones ambiguas
Consulta ineficiente:
SELECT *
FROM ventas, clientes
WHERE ventas.id_cliente = clientes.id_cliente; Consulta correcta:
SELECT v.id_venta, c.nombre, v.total
FROM ventas AS v
JOIN clientes AS c ON v.id_cliente = c.id_cliente; 3. Usa índices con intención (y comprende B-Tree)
¿Qué es un índice B-Tree en PostgreSQL?
Es la estructura de índice por defecto en PostgreSQL.
Ventajas:
- Se adapta bien a prácticamente cualquier tamaño de tabla
- Permite búsquedas rápidas usando comparaciones (<, >, =, BETWEEN)
- Optimiza ORDER BY y GROUP BY
- Mantiene los datos «ordenados» lógicamente
Se recomienda un índice B-Tree cuando consultas por:
- Igualdad (
=) - Rango (
BETWEEN,>,<) - Condiciones compuestas
- Claves foráneas
📌 Ejemplo:
CREATE INDEX idx_ventas_id_cliente
ON ventas(id_cliente); 4. Evita funciones en columnas indexadas en WHERE
Ineficiente (rompe el índice):
SELECT *
FROM ventas
WHERE DATE(fecha) = '2025-01-01'; Optimizado:
SELECT *
FROM ventas
WHERE fecha >= '2025-01-01'
AND fecha < '2025-01-02'; 5. Usa EXPLAIN y EXPLAIN ANALYZE para entender tu consulta
EXPLAIN ANALYZE
SELECT *
FROM ventas
WHERE total > 500; Esto te dice:
- Si usó índice
- Cuánto tiempo tardó
- Si hubo “secuencial scan” (mala señal en tablas grandes)
6. Normaliza tus tablas (hasta donde tenga sentido)
La normalización:
- Reduce duplicidad
- Acelera actualizaciones
- Mejora integridad
Ejemplo de mala práctica:
-- cliente y dirección duplicados en la tabla ventas Versión normalizada:
SELECT v.id_venta, c.nombre, d.ciudad
FROM ventas v
JOIN clientes c ON v.id_cliente = c.id_cliente
JOIN direcciones d ON c.id_direccion = d.id_direccion; 7. Usa LIMIT en herramientas de análisis
Cuando exploras datos:
SELECT *
FROM ventas
LIMIT 50; Esto descarga solo lo necesario.
8. Prefiere COUNT(*) sobre COUNT(columna)
En PostgreSQL, COUNT(*) es más rápido, porque no valida nulos.
Correcto:
SELECT COUNT(*) FROM ventas; 9. Filtra lo más pronto posible
Ineficiente:
SELECT nombre
FROM clientes
JOIN ventas ON ventas.id_cliente = clientes.id_cliente; Optimizado:
SELECT nombre
FROM clientes
WHERE activo = TRUE
JOIN ventas ON ventas.id_cliente = clientes.id_cliente; 10. Usa CTE solo si realmente mejora la claridad
Antes:
WITH datos AS (
SELECT * FROM ventas WHERE total > 500
)
SELECT COUNT(*) FROM datos; Pero PostgreSQL puede optimizar mejor sin CTE:
SELECT COUNT(*)
FROM ventas
WHERE total > 500; 11. Maneja NULL correctamente
Evita:
WHERE columna <> 10 Es incapaz de evaluar NULL.
Usa:
WHERE columna IS NOT NULL
AND columna <> 10; 12. Documenta tu SQL
Los SQL “rápidos pero oscuros” generan problemas futuros.
-- ventas mayores a $500 en el último trimestre
SELECT id_venta, fecha, total
FROM ventas
WHERE total > 500
AND fecha >= '2025-10-01'; Conclusión
Estas 12 buenas prácticas son la base para escribir SQL más claro, rápido y profesional. PostgreSQL es muy potente, pero solo muestra su verdadero rendimiento cuando usamos consultas bien diseñadas.