В SQL Server, COUNT_BIG()
функция и COUNT()
направете по същество същото нещо:върнете броя на елементите, намерени в група. По принцип можете да използвате тези функции, за да разберете колко реда има в таблица или набор от резултати.
В много случаи ще можете да изберете този, който предпочитате. Въпреки това, има разлика между тези две функции, която може да ви наложи да използвате една над друга.
Разликата е, че COUNT()
връща резултата си като int , докато COUNT_BIG()
връща резултата си като голям .
С други думи, ще трябва да използвате COUNT_BIG()
ако очаквате резултатите да са по-големи от 2 147 483 647 (т.е. ако заявката връща повече от 2 147 483 647 реда).
Пример 1 – Когато COUNT() е ОК
Ето основен пример, показващ сценарий, при който и двете COUNT()
и COUNT_BIG()
може да се използва:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Резултат:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Можем да видим, че има 231412 реда в Факт.[Поръчка] таблица.
В този случай и двете функции могат да се справят с това, тъй като броят на редовете е достатъчно малък, за да бъде съхранен в int както и единиг .
Въпреки това, ако резултатът е бил толкова голям, че еint не можахме да го съхраним, тогава ще можем да използваме само COUNT_BIG()
.
Пример 2 – Когато се изисква COUNT_BIG()
Ето пример за това къде трябва да използвате COUNT_BIG()
.
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Резултат:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
В този случай броят на редовете е толкова голям, че еint не би могъл да се справи. За щастие можем да използваме COUNT_BIG()
, защото връща резултата си като голям .
Проверка на типа данни на двете функции
Когато разгледаме предишните примери, всъщност не можем да видим името на типа данни. Можем само да предположим, че COUNT()
връща резултатите си като int и COUNT_BIG()
използва bigint защото това казва документацията на Microsoft (въпреки че знаем, че вторият пример не може да бъде int защото стойността е твърде голяма за int ).
Можем да използваме sp_describe_first_result_set
съхранена процедура за проверка на връщания тип данни за всяка от тези функции.
Проверете типа данни за COUNT()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Резултат (с помощта на вертикален изход):
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
Да, има много информация, от която не се нуждаем, но ако погледнете system_type_name колона, ще видите, че стойността му е int . Това ни казва, че нашата заявка е върнала резултатите си като int , както се очаква. Можете също да видите, че max_length и прецизност стойностите са в съответствие с int тип данни.
Проверете типа данни за COUNT_BIG()
За този пример всичко, което трябва да направим, е да заменим COUNT(*)
с COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Резултат (с помощта на вертикален изход):
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
Този път можем да видим, че
system_type_name
е
голям
. Това ни казва, че нашият COUNT_BIG()
query върна резултатите си като bigint , както се очаква.
max_length
и
прецизност
стойностите също са в съответствие с bigint тип данни.
Между другото, по-бърз начин да направите горното е да комбинирате и двете функции в заявка при извикване на съхранената процедура.
Като това:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Това ще изведе два реда, по един за всяка функция в SELECT
изявление.