sql >> Base de Datos >  >> RDS >> Sqlserver

COUNT() vs COUNT_BIG() en SQL Server:¿Cuál es la diferencia?

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.