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.