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.