Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

COUNT() vs. COUNT_BIG() in SQL Server:Was ist der Unterschied?

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.