¡Hola, analistas y entusiastas de SQL!, hoy vamos a desentrañar uno de los mitos más persistentes en el mundo de las bases de datos:

👉 ¿Es mejor usar COUNT(*) o COUNT(1) en nuestras consultas SQL?

Algunos dicen que COUNT(1) es más rápido porque evita leer todas las columnas, otros aseguran que COUNT(*) es la mejor opción porque es más eficiente. Pero, ¿qué hay de cierto en esto? 🤯 Vamos a analizar cada opción en detalle, con ejemplos prácticos y pruebas de rendimiento, para que puedas tomar una decisión informada la próxima vez que necesites contar registros en tu base de datos.

🔍 ¿Qué hace COUNT en SQL?

Antes de entrar en comparaciones, repasemos cómo funciona COUNT en SQL y qué opciones tenemos:

COUNT(*)

  • Cuenta todas las filas de una tabla, sin importar si tienen valores NULL o no.
  • Se usa comúnmente para obtener el número total de registros en una tabla.

COUNT(1)

  • También cuenta todas las filas de una tabla, pero evalúa la constante 1 en cada fila en lugar de contar todas las columnas.
  • La idea detrás de COUNT(1) es que “evita leer columnas innecesarias”, lo que podría mejorar el rendimiento (esto lo analizaremos más adelante).

COUNT(columna)

  • Solo cuenta las filas donde la columna especificada NO sea NULL.
  • Útil cuando queremos contar solo registros con información válida en una columna específica.

📌 Ejemplo práctico:
Imaginemos que tenemos una tabla Clientes con los siguientes datos:

IDNombreEmailCiudad
1Mariamaria@email.comMadrid
2JuanNullSevilla
3Pedropedro@email.comValencia

Si ejecutamos estas consultas:

SELECT COUNT(*) FROM Clientes;  -- Cuenta todas las filas (3)
SELECT COUNT(1) FROM Clientes;  -- Cuenta todas las filas (3)
SELECT COUNT(Email) FROM Clientes;  -- Solo cuenta los registros donde Email NO es NULL (2)

🔹 Resultado:

  • COUNT(*) y COUNT(1) devuelven 3, porque hay tres filas en total.
  • COUNT(Email) devuelve 2, porque solo hay dos correos electrónicos registrados.

Ya tenemos claro qué hace COUNT, ahora veamos qué opción es mejor.

📊 Comparación técnica: COUNT(*) vs COUNT(1)

Cuando ejecutamos COUNT(*) o COUNT(1), ¿realmente hay una diferencia en cómo el motor de base de datos procesa la consulta?

SET STATISTICS IO ON;  
SET STATISTICS TIME ON;  
GO  
SELECT COUNT(*) FROM Clientes;  
SELECT COUNT(1) FROM Clientes; 
GO  
SET STATISTICS IO OFF;  
SET STATISTICS TIME OFF;

En estos motores modernos, ambas consultas generan el mismo plan de ejecución. Esto significa que no hay diferencia de rendimiento porque el optimizador trata ambas consultas de la misma manera.

📌 ¿Y en bases de datos antiguas?

En versiones más antiguas de MySQL (4.x) y SQL Server 2000, se decía que COUNT(1) era más eficiente porque COUNT(*) leía todas las columnas de la tabla. Pero esto ya no es un problema en versiones recientes, donde los motores optimizan automáticamente la ejecución.

🔥 Conclusión: En bases de datos modernas, NO hay diferencia de rendimiento entre COUNT(*) y COUNT(1).

⚡ ¿Cuándo usar cada opción?

Si ambas opciones son equivalentes en rendimiento en bases de datos modernas, ¿cuál deberíamos usar?

OpciónCuando UsarloCuando Evitarlo
COUNT(*)Siempre en bases modernas. El código más claro y estándarSi trabajas en bases antigua y notas lentitud
COUNT(1)Si te gusta el estilo más explicito (pero no es necesario)Realmente no aporta beneficios en bases de datos modernas.
COUNT(columna)Si solo quieres valores No nulosSi necesitas contar todas las filas.

📌 Ejemplo de uso correcto de COUNT(columna): Si queremos contar cuántos clientes tienen email registrado:

SELECT COUNT(Email) FROM Clientes;  -- Solo cuenta clientes con email NO NULL
SELECT COUNT(*) FROM Clientes;

Pruebas de rendimiento en tablas grandes

Para demostrar que COUNT(*) y COUNT(1) funcionan igual en bases modernas, hice una prueba con una tabla de mil de registros en SQL Server 20.

Ejecuté ambas consultas:

Resultados:

🔎 Ambos tienen el mismo tiempo de ejecución, lo que confirma que la optimización del motor SQL los trata igual.

Mitos comunes sobre COUNT(*) y COUNT(1)

Mito: COUNT(1) es más rápido porque solo evalúa una constante.
Realidad: En bases modernas, ambas consultas generan el mismo plan de ejecución.

Mito: COUNT(*) es menos eficiente porque lee todas las columnas.
Realidad: COUNT(*) no lee todas las columnas, solo cuenta las filas en la estructura interna de la tabla.

Mito: COUNT(1) es mejor en todas las bases de datos.
Realidad: Solo tenía una posible ventaja en bases de datos antiguas, pero en versiones recientes no hay diferencia.

Conclusión final

En bases de datos modernas, COUNT(*) y COUNT(1) son equivalentes en rendimiento.

Si necesitas contar valores no nulos, usa COUNT(columna).

Si trabajas en bases de datos antiguas, haz pruebas de rendimiento y usa lo que funcione mejor.

Recomendación: Usa COUNT(*), ya que es más claro, estándar y compatible con todos los motores.

Espero que este artículo te haya aclarado las dudas. ¿Has encontrado diferencias en tu experiencia con COUNT(*) y COUNT(1)? ¡Déjamelo en los comentarios!

Sígueme para más contenido sobre SQL, optimización y análisis de datos. ¡Nos vemos en el próximo blog!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

X