sql >> Database >  >> RDS >> Sqlserver

COUNT() versus COUNT_BIG() in SQL Server:wat is het verschil?

In SQL Server, de COUNT_BIG() functie en de COUNT() doe in wezen hetzelfde:retourneer het aantal items dat in een groep is gevonden. In principe kunt u deze functies gebruiken om erachter te komen hoeveel rijen een tabel of resultatenset bevat.

In veel gevallen kunt u kiezen welke u wilt. Er is echter een verschil tussen deze twee functies die ertoe kunnen leiden dat u de ene boven de andere moet gebruiken.

Het verschil is dat COUNT() geeft het resultaat terug als een int , terwijl COUNT_BIG() geeft het resultaat terug als een bigint .

Met andere woorden, u moet COUNT_BIG() . gebruiken als u verwacht dat de resultaten groter zijn dan 2.147.483.647 (d.w.z. als de query meer dan 2.147.483.647 rijen retourneert).

Voorbeeld 1 – Als COUNT() OK is

Hier is een eenvoudig voorbeeld van een scenario waarin zowel COUNT() en COUNT_BIG() kan worden gebruikt:

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

Resultaat:

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

We kunnen zien dat er 231412 rijen zijn in de Fact.[Order] tafel.

In dit geval kunnen beide functies het aan, omdat het aantal rijen klein genoeg is om te worden opgeslagen in een int evenals een grote .

Als het resultaat echter zo groot was dat een int niet kunnen opslaan, dan kunnen we alleen COUNT_BIG() . gebruiken .

Voorbeeld 2 – Wanneer COUNT_BIG() vereist is

Hier is een voorbeeld van waar u COUNT_BIG() moet gebruiken .

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

Resultaat:

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

In dit geval is het aantal rijen zo groot dat een int zou het niet aankunnen. Gelukkig kunnen we COUNT_BIG() . gebruiken , omdat het het resultaat retourneert als een bigint .

Het gegevenstype van beide functies controleren

Als we naar de vorige voorbeelden kijken, kunnen we de naam van het gegevenstype niet echt zien. We kunnen alleen maar aannemen dat COUNT() geeft de resultaten terug als een int en COUNT_BIG() gebruikt bigint omdat dat is wat de Microsoft-documentatie zegt (hoewel we wel weten dat het tweede voorbeeld geen int kan zijn omdat de waarde te groot is voor een int ).

We kunnen de sp_describe_first_result_set . gebruiken opgeslagen procedure om het retourgegevenstype van elk van deze functies te controleren.

Controleer het gegevenstype voor COUNT()

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

Resultaat (met verticale uitvoer):

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, er is veel informatie die we niet nodig hebben, maar als je kijkt naar de system_type_name kolom, ziet u dat de waarde int . is . Dit vertelt ons dat onze zoekopdracht de resultaten heeft geretourneerd als een int , zoals verwacht. Je kunt ook zien dat de max_length en precisie waarden komen overeen met de int gegevenstype.

Controleer het gegevenstype voor COUNT_BIG()

Voor dit voorbeeld hoeven we alleen maar COUNT(*) . te vervangen met COUNT_BIG(*) :

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

Resultaat (met verticale uitvoer):

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

Deze keer kunnen we zien dat system_type_name is groot . Dit vertelt ons dat onze COUNT_BIG() zoekopdracht heeft de resultaten geretourneerd als een bigin , zoals verwacht. De max_length en precisie waarden komen ook overeen met de groten gegevenstype.

Trouwens, een snellere manier om het bovenstaande te doen, is door beide functies in een query te combineren bij het aanroepen van de opgeslagen procedure.

Zoals dit:

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

Dat levert twee rijen op, één voor elke functie in de SELECT verklaring.


  1. Reset een reeks volgens het jaar, niet op min of max waarde

  2. H2 postgresql-modus lijkt niet te werken voor mij

  3. Hoe de CHARINDEX()-functie werkt in SQL Server (T-SQL)

  4. PostgreSQL TOONT ​​TABELLEN Equivalent (psql)