I SQL Server, COUNT_BIG()
funktionen och COUNT()
gör i princip samma sak:returnera antalet föremål som finns i en grupp. I grund och botten kan du använda dessa funktioner för att ta reda på hur många rader som finns i en tabell eller resultatuppsättning.
I många fall kommer du att kunna välja vilken du föredrar. Det finns dock en skillnad mellan dessa två funktioner som kan diktera att du ska använda den ena framför den andra.
Skillnaden är att COUNT()
returnerar resultatet som en int , medan COUNT_BIG()
returnerar resultatet som en bigint .
Med andra ord måste du använda COUNT_BIG()
om du förväntar dig att resultatet ska vara större än 2 147 483 647 (dvs om frågan returnerar fler än 2 147 483 647 rader).
Exempel 1 – När COUNT() är OK
Här är ett grundläggande exempel som visar ett scenario där både COUNT()
och COUNT_BIG()
kan användas:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Resultat:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Vi kan se att det finns 231412 rader i Fakta.[Order] bord.
I det här fallet kan båda funktionerna hantera det, eftersom radantalet är tillräckligt litet för att lagras i en int samt en bigint .
Men om resultatet var så stort att en int inte kunde lagra den, då skulle vi bara kunna använda COUNT_BIG()
.
Exempel 2 – När COUNT_BIG() krävs
Här är ett exempel på var du skulle behöva använda COUNT_BIG()
.
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Resultat:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
I det här fallet är radantalet så stort att en int inte skulle kunna hantera det. Lyckligtvis kan vi använda COUNT_BIG()
, eftersom det returnerar sitt resultat som en bigint .
Kontrollera datatypen för båda funktionerna
När vi tittar på de tidigare exemplen kan vi faktiskt inte se datatypens namn. Vi kan bara anta att COUNT()
returnerar sina resultat som en int och COUNT_BIG()
använder bigt eftersom det är vad Microsofts dokumentation säger (även om vi vet att det andra exemplet inte kan vara ett int eftersom värdet är för stort för en int ).
Vi kan använda sp_describe_first_result_set
lagrad procedur för att kontrollera returdatatypen för var och en av dessa funktioner.
Kontrollera datatypen för COUNT()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Resultat (med vertikal utdata):
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
Ja, det finns mycket information vi inte behöver, men om du tittar på system_type_name kolumnen ser du att dess värde är int . Detta talar om för oss att vår sökning gav sina resultat som en int , som förväntat. Du kan också se att max_length och precision värden överensstämmer med int datatyp.
Kontrollera datatypen för COUNT_BIG()
För det här exemplet behöver vi bara ersätta COUNT(*)
med COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Resultat (med vertikal utdata):
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
Den här gången kan vi se att
system_type_name
är
stor
. Detta talar om för oss att vår COUNT_BIG()
sökfrågan returnerade sina resultat som en bigint , som förväntat.
max_length
och
precision
värden överensstämmer också med bigint datatyp.
Förresten, ett snabbare sätt att göra ovanstående är att kombinera båda funktionerna i fråga när du anropar den lagrade proceduren.
Så här:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Det kommer att mata ut två rader, en för varje funktion i SELECT
uttalande.