sql >> Database teknologi >  >> RDS >> Sqlserver

COUNT() vs COUNT_BIG() i SQL Server:Hvad er forskellen?

I SQL Server er COUNT_BIG() funktionen og COUNT() gør stort set det samme:returner antallet af genstande fundet i en gruppe. Grundlæggende kan du bruge disse funktioner til at finde ud af, hvor mange rækker der er i en tabel eller et resultatsæt.

I mange tilfælde vil du være i stand til at vælge den, du foretrækker. Der er dog en forskel mellem disse to funktioner, der kan diktere, at du skal bruge den ene frem for den anden.

Forskellen er, at COUNT() returnerer sit resultat som en int , hvorimod COUNT_BIG() returnerer sit resultat som en bigint .

Med andre ord skal du bruge COUNT_BIG() hvis du forventer, at resultaterne er større end 2.147.483.647 (dvs. hvis forespørgslen returnerer mere end 2.147.483.647 rækker).

Eksempel 1 – Når COUNT() er OK

Her er et grundlæggende eksempel, der viser et scenarie, hvor både COUNT() og COUNT_BIG() kan bruges:

USE WideWorldImportersDW;
SELECT 
  COUNT(*) AS 'COUNT',
  COUNT_BIG(*) AS 'COUNT_BIG' 
FROM Fact.[Order];

Resultat:

+---------+-------------+
| COUNT   | COUNT_BIG   |
|---------+-------------|
| 231412  | 231412      |
+---------+-------------+

Vi kan se, at der er 231412 rækker i Fakta.[Order] tabel.

I dette tilfælde kan begge funktioner håndtere det, fordi rækkeantallet er lille nok til at blive gemt i en int samt en bigt .

Men hvis resultatet var så stort, at en int ikke kunne gemme det, så ville vi kun være i stand til at bruge COUNT_BIG() .

Eksempel 2 – Når COUNT_BIG() er påkrævet

Her er et eksempel på, hvor du skal bruge COUNT_BIG() .

SELECT COUNT_BIG(*) AS 'Row Count' 
FROM ReallyBigTable;

Resultat:

+-----------------+
| Row Count       |
|-----------------|
| 9147483648      |
+-----------------+

I dette tilfælde er rækkeantallet så stort, at en int ikke ville kunne klare det. Heldigvis kan vi bruge COUNT_BIG() , fordi den returnerer sit resultat som en bigint .

Kontrol af datatypen for begge funktioner

Når vi ser på de foregående eksempler, kan vi faktisk ikke se datatypens navn. Vi kan kun antage, at COUNT() returnerer sine resultater som en int og COUNT_BIG() bruger bigt fordi det er, hvad Microsoft-dokumentationen siger (selvom vi ved, at det andet eksempel ikke kunne være en int fordi værdien er for stor til en int ).

Vi kan bruge sp_describe_first_result_set gemt procedure for at kontrollere returneringsdatatypen for hver af disse funktioner.

Tjek datatypen for COUNT()

EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;

Resultat (ved hjælp af lodret output):

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, der er mange oplysninger, vi ikke har brug for, men hvis du ser på system_type_name kolonne, vil du se, at dens værdi er int . Dette fortæller os, at vores forespørgsel returnerede sine resultater som en int , som forventet. Du kan også se, at max_length og præcision værdier stemmer overens med int datatype.

Tjek datatypen for COUNT_BIG()

For dette eksempel er alt, hvad vi skal gøre, at erstatte COUNT(*) med COUNT_BIG(*) :

EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;

Resultat (ved hjælp af lodret output):

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

Denne gang kan vi se det system_type_name er stor . Dette fortæller os, at vores COUNT_BIG() forespørgslen returnerede sine resultater som en bigint , som forventet. max_length og præcision værdier er også i overensstemmelse med bigint datatype.

Forresten, en hurtigere måde at gøre ovenstående på er at kombinere begge funktioner i forespørgsel, når du kalder den lagrede procedure.

Sådan:

EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;

Det vil udlæse to rækker, en for hver funktion i SELECT erklæring.


  1. Et dybdegående kig på databaseindeksering

  2. Eksporter SQLite-database til en CSV-fil

  3. Vil du flette JSONB-værdier i PostgreSQL?

  4. Opret en "I stedet for" Trigger i SQL Server