Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

COUNT() vs COUNT_BIG() w SQL Server:jaka jest różnica?

W SQL Server COUNT_BIG() funkcja i COUNT() zrób zasadniczo to samo:zwróć liczbę elementów znalezionych w grupie. Zasadniczo możesz użyć tych funkcji, aby dowiedzieć się, ile wierszy znajduje się w tabeli lub zestawie wyników.

W wielu przypadkach będziesz mógł wybrać ten, który wolisz. Istnieje jednak różnica między tymi dwiema funkcjami, która może dyktować użycie jednej z drugiej.

Różnica polega na tym, że COUNT() zwraca swój wynik jako int , natomiast COUNT_BIG() zwraca swój wynik jako bigin .

Innymi słowy, musisz użyć COUNT_BIG() jeśli oczekujesz, że jego wyniki będą większe niż 2147 483 647 (tj. jeśli zapytanie zwróci więcej niż 2 147 483 647 wierszy).

Przykład 1 – Kiedy LICZBA() jest OK

Oto podstawowy przykład pokazujący scenariusz, w którym obie metody COUNT() i COUNT_BIG() można użyć:

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

Wynik:

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

Widzimy, że w Fakcie.[Zamówienie] jest 231412 wierszy tabela.

W tym przypadku obie funkcje mogą to obsłużyć, ponieważ liczba wierszy jest wystarczająco mała, aby można je było przechowywać w int jak również duży .

Jeśli jednak wynik był tak duży, że int nie mógł go przechowywać, wtedy moglibyśmy użyć tylko COUNT_BIG() .

Przykład 2 – Kiedy COUNT_BIG() jest wymagane

Oto przykład, w którym musisz użyć COUNT_BIG() .

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

Wynik:

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

W tym przypadku liczba wierszy jest tak duża, że ​​int nie byłby w stanie sobie z tym poradzić. Na szczęście możemy użyć COUNT_BIG() , ponieważ zwraca swój wynik jako bigin .

Sprawdzanie typu danych obu funkcji

Kiedy patrzymy na poprzednie przykłady, tak naprawdę nie widzimy nazwy typu danych. Możemy tylko założyć, że COUNT() zwraca swoje wyniki jako int i COUNT_BIG() używa bigin ponieważ tak mówi dokumentacja Microsoft (chociaż wiemy, że drugi przykład nie może być int ponieważ wartość jest za duża dla int ).

Możemy użyć sp_describe_first_result_set procedura składowana w celu sprawdzenia zwracanego typu danych każdej z tych funkcji.

Sprawdź typ danych dla COUNT()

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

Wynik (przy użyciu wyjścia pionowego):

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

Tak, jest wiele informacji, których nie potrzebujemy, ale jeśli spojrzysz na system_type_name kolumna, zobaczysz, że jej wartość to int . To mówi nam, że nasze zapytanie zwróciło wyniki jako int , zgodnie z oczekiwaniami. Możesz również zobaczyć, że max_length i precyzja wartości są zgodne z int typ danych.

Sprawdź typ danych dla COUNT_BIG()

W tym przykładzie wszystko, co musimy zrobić, to zastąpić COUNT(*) z COUNT_BIG(*) :

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

Wynik (przy użyciu wyjścia pionowego):

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

Tym razem widzimy, że system_type_name jest duży . To mówi nam, że nasza COUNT_BIG() zapytanie zwróciło swoje wyniki jako bigin , zgodnie z oczekiwaniami. max_length i precyzja wartości są również zgodne z bigint typ danych.

Nawiasem mówiąc, szybszym sposobem wykonania powyższego jest połączenie obu funkcji w zapytanie podczas wywoływania procedury składowanej.

Tak:

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

Spowoduje to wyświetlenie dwóch wierszy, po jednym dla każdej funkcji w SELECT oświadczenie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączenie wielu tabel w SQL

  2. Podstawy automatyzacji zadań SQL Server

  3. Przekaż zmienną do wyzwalacza

  4. JSON_MODIFY() Przykłady w SQL Server (T-SQL)

  5. Indeksy SQL Server — rosnąco czy malejąco, co to za różnica?