sql >> Databasteknik >  >> RDS >> Sqlserver

COUNT() vs COUNT_BIG() i SQL Server:Vad är skillnaden?

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.


  1. Hur man får flera räkningar med en enda fråga i MySQL

  2. Hur man hittar alla anslutna subgrafer i en oriktad graf

  3. ISJSON() Exempel i SQL Server (T-SQL)

  4. SQLAlchemy - SQLite för testning och Postgresql för utveckling - Hur portar man?