In SQL Server der COUNT_BIG()
Funktion und die COUNT()
tun im Wesentlichen dasselbe:geben die Anzahl der in einer Gruppe gefundenen Elemente zurück. Grundsätzlich können Sie diese Funktionen verwenden, um herauszufinden, wie viele Zeilen sich in einer Tabelle oder Ergebnismenge befinden.
In vielen Fällen können Sie wählen, welche Sie bevorzugen. Es gibt jedoch einen Unterschied zwischen diesen beiden Funktionen, der möglicherweise vorschreibt, dass Sie eine über der anderen verwenden müssen.
Der Unterschied besteht darin, dass COUNT()
gibt sein Ergebnis als int zurück , wohingegen COUNT_BIG()
gibt sein Ergebnis als bigint zurück .
Mit anderen Worten, Sie müssen COUNT_BIG()
verwenden wenn Sie erwarten, dass die Ergebnisse größer als 2.147.483.647 sind (d. h. wenn die Abfrage mehr als 2.147.483.647 Zeilen zurückgibt).
Beispiel 1 – Wenn COUNT() OK ist
Hier ist ein einfaches Beispiel, das ein Szenario zeigt, in dem sowohl COUNT()
und COUNT_BIG()
kann verwendet werden:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Ergebnis:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Wir können sehen, dass es 231412 Zeilen in Fact.[Order] gibt Tabelle.
In diesem Fall können beide Funktionen damit umgehen, da die Zeilenanzahl klein genug ist, um in einem int gespeichert zu werden sowie ein bigint .
Wenn das Ergebnis jedoch so groß war, dass ein int nicht speichern könnten, dann könnten wir nur COUNT_BIG()
verwenden .
Beispiel 2 – Wenn COUNT_BIG() erforderlich ist
Hier ist ein Beispiel dafür, wo Sie COUNT_BIG()
verwenden müssen .
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Ergebnis:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
In diesem Fall ist die Zeilenanzahl so groß, dass ein int würde damit nicht umgehen können. Glücklicherweise können wir COUNT_BIG()
verwenden , weil es sein Ergebnis als bigint zurückgibt .
Überprüfen des Datentyps beider Funktionen
Wenn wir uns die vorherigen Beispiele ansehen, können wir den Namen des Datentyps nicht wirklich sehen. Wir können nur annehmen, dass COUNT()
gibt seine Ergebnisse als int zurück und COUNT_BIG()
verwendet bigint denn so steht es in der Microsoft-Dokumentation (obwohl wir wissen, dass das zweite Beispiel kein int sein kann weil der Wert zu groß für ein int ist ).
Wir können das sp_describe_first_result_set
verwenden gespeicherte Prozedur, um den Rückgabedatentyp jeder dieser Funktionen zu überprüfen.
Überprüfen Sie den Datentyp für COUNT()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Ergebnis (bei vertikaler Ausgabe):
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, es gibt viele Informationen, die wir nicht brauchen, aber wenn Sie sich den system_type_name ansehen Spalte sehen Sie, dass ihr Wert int ist . Dies sagt uns, dass unsere Abfrage ihre Ergebnisse als int zurückgegeben hat , wie erwartet. Sie können auch sehen, dass die max_length und Präzision Werte stimmen mit int überein Datentyp.
Überprüfen Sie den Datentyp für COUNT_BIG()
Für dieses Beispiel müssen wir lediglich COUNT(*)
ersetzen mit COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Ergebnis (bei vertikaler Ausgabe):
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
Dieses Mal können wir diesen
system_type_name
sehen ist
bigint
. Dies sagt uns, dass unser COUNT_BIG()
Die Abfrage hat ihre Ergebnisse als bigint zurückgegeben , wie erwartet. Die
max_length
und
Präzision
Werte stimmen auch mit bigint überein Datentyp.
Eine schnellere Möglichkeit, dies zu tun, besteht übrigens darin, beide Funktionen in einer Abfrage zu kombinieren, wenn die gespeicherte Prozedur aufgerufen wird.
So:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Dadurch werden zwei Zeilen ausgegeben, eine für jede Funktion in SELECT
Aussage.