En SQL Server, el COUNT_BIG()
función y el COUNT()
hacer esencialmente lo mismo:devolver la cantidad de elementos encontrados en un grupo. Básicamente, puede usar estas funciones para averiguar cuántas filas hay en una tabla o conjunto de resultados.
En muchos casos, podrás elegir el que prefieras. Sin embargo, hay una diferencia entre estas dos funciones que podría dictar que use una sobre la otra.
La diferencia es que COUNT()
devuelve su resultado como un int , mientras que COUNT_BIG()
devuelve su resultado como bigint .
En otras palabras, deberá usar COUNT_BIG()
si espera que sus resultados sean mayores que 2 147 483 647 (es decir, si la consulta devuelve más de 2 147 483 647 filas).
Ejemplo 1:cuando COUNT() está bien
Este es un ejemplo básico que muestra un escenario en el que tanto COUNT()
y COUNT_BIG()
se puede utilizar:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Resultado:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Podemos ver que hay 231412 filas en el Fact.[Order] mesa.
En este caso, ambas funciones pueden manejarlo, porque el recuento de filas es lo suficientemente pequeño como para almacenarse en un int así como un bigint .
Sin embargo, si el resultado fuera tan grande que un int no pudo almacenarlo, entonces solo podríamos usar COUNT_BIG()
.
Ejemplo 2:cuando se requiere COUNT_BIG()
Aquí hay un ejemplo de dónde necesitaría usar COUNT_BIG()
.
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Resultado:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
En este caso, el recuento de filas es tan grande que un int no sería capaz de manejarlo. Afortunadamente podemos usar COUNT_BIG()
, porque devuelve su resultado como bigint .
Comprobación del tipo de datos de ambas funciones
Cuando observamos los ejemplos anteriores, en realidad no podemos ver el nombre del tipo de datos. Solo podemos asumir que COUNT()
devuelve sus resultados como un int y COUNT_BIG()
usa bigint porque eso es lo que dice la documentación de Microsoft (aunque sabemos que el segundo ejemplo no podría ser un int porque el valor es demasiado grande para un int ).
Podemos usar el sp_describe_first_result_set
procedimiento almacenado para comprobar el tipo de datos de retorno de cada una de estas funciones.
Verifique el tipo de datos para COUNT()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Resultado (usando salida vertical):
is_hidden | 0 column_ordinal | 1 name | NULL is_nullable | 1 system_type_id | 56 system_type_name | int max_length | 4 precision | 10 scale | 0 collation_name | NULL user_type_id | NULL user_type_database | NULL user_type_schema | NULL user_type_name | NULL assembly_qualified_type_name | NULL xml_collection_id | NULL xml_collection_database | NULL xml_collection_schema | NULL xml_collection_name | NULL is_xml_document | 0 is_case_sensitive | 0 is_fixed_length_clr_type | 0 source_server | NULL source_database | NULL source_schema | NULL source_table | NULL source_column | NULL is_identity_column | 0 is_part_of_unique_key | NULL is_updateable | 0 is_computed_column | 0 is_sparse_column_set | 0 ordinal_in_order_by_list | NULL order_by_is_descending | NULL order_by_list_length | NULL tds_type_id | 38 tds_length | 4 tds_collation_id | NULL tds_collation_sort_id | NULL
Sí, hay mucha información que no necesitamos, pero si observa el system_type_name columna, verá que su valor es int . Esto nos dice que nuestra consulta devolvió sus resultados como int , como se esperaba. También puede ver que max_length y precisión los valores son consistentes con el int tipo de datos.
Verifique el tipo de datos para COUNT_BIG()
Para este ejemplo, todo lo que tenemos que hacer es reemplazar COUNT(*)
con COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Resultado (usando salida vertical):
is_hidden | 0 column_ordinal | 1 name | NULL is_nullable | 1 system_type_id | 127 system_type_name | bigint max_length | 8 precision | 19 scale | 0 collation_name | NULL user_type_id | NULL user_type_database | NULL user_type_schema | NULL user_type_name | NULL assembly_qualified_type_name | NULL xml_collection_id | NULL xml_collection_database | NULL xml_collection_schema | NULL xml_collection_name | NULL is_xml_document | 0 is_case_sensitive | 0 is_fixed_length_clr_type | 0 source_server | NULL source_database | NULL source_schema | NULL source_table | NULL source_column | NULL is_identity_column | 0 is_part_of_unique_key | NULL is_updateable | 0 is_computed_column | 0 is_sparse_column_set | 0 ordinal_in_order_by_list | NULL order_by_is_descending | NULL order_by_list_length | NULL tds_type_id | 38 tds_length | 8 tds_collation_id | NULL tds_collation_sort_id | NULL
Esta vez podemos ver que
system_type_name
es
bigint
. Esto nos dice que nuestro COUNT_BIG()
la consulta devolvió sus resultados como bigint , como se esperaba. La
longitud_máxima
y
precisión
los valores también son consistentes con el bigint tipo de datos.
Por cierto, una forma más rápida de hacer lo anterior es combinar ambas funciones en una consulta al llamar al procedimiento almacenado.
Así:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Eso generará dos filas, una para cada función en SELECT
declaración.