V SQL Server, COUNT_BIG()
funkce a COUNT()
udělat v podstatě to samé:vrátit počet položek nalezených ve skupině. V zásadě můžete pomocí těchto funkcí zjistit, kolik řádků je v tabulce nebo sadě výsledků.
V mnoha případech si budete moci vybrat, kterou z nich preferujete. Mezi těmito dvěma funkcemi je však rozdíl, který vám může diktovat, abyste používali jednu přes druhou.
Rozdíl je v tom, že COUNT()
vrátí výsledek jako int , zatímco COUNT_BIG()
vrátí výsledek jako bigint .
Jinými slovy, budete muset použít COUNT_BIG()
pokud očekáváte, že jeho výsledky budou větší než 2 147 483 647 (tj. pokud dotaz vrátí více než 2 147 483 647 řádků).
Příklad 1 – Když je COUNT() v pořádku
Zde je základní příklad ukazující scénář, kde obě COUNT()
a COUNT_BIG()
lze použít:
USE WideWorldImportersDW; SELECT COUNT(*) AS 'COUNT', COUNT_BIG(*) AS 'COUNT_BIG' FROM Fact.[Order];
Výsledek:
+---------+-------------+ | COUNT | COUNT_BIG | |---------+-------------| | 231412 | 231412 | +---------+-------------+
Vidíme, že Fact.[Objednávka] obsahuje 231412 řádků. tabulka.
V tomto případě to zvládnou obě funkce, protože počet řádků je dostatečně malý na to, aby se dal uložit do int stejně jako bigint .
Pokud by však byl výsledek tak velký, že by int nemohli uložit, pak bychom mohli použít pouze COUNT_BIG()
.
Příklad 2 – Když je vyžadováno COUNT_BIG()
Zde je příklad toho, kde byste měli použít COUNT_BIG()
.
SELECT COUNT_BIG(*) AS 'Row Count' FROM ReallyBigTable;
Výsledek:
+-----------------+ | Row Count | |-----------------| | 9147483648 | +-----------------+
V tomto případě je počet řádků tak velký, že int by to nezvládl. Naštěstí můžeme použít COUNT_BIG()
, protože výsledek vrátí jako bigint .
Kontrola datového typu obou funkcí
Když se podíváme na předchozí příklady, ve skutečnosti nevidíme název datového typu. Můžeme pouze předpokládat, že COUNT()
vrátí své výsledky jako int a COUNT_BIG()
používá bigint protože to říká dokumentace společnosti Microsoft (ačkoli víme, že druhý příklad nemůže být int protože hodnota je příliš velká pro int ).
Můžeme použít sp_describe_first_result_set
uložená procedura ke kontrole návratového datového typu každé z těchto funkcí.
Zkontrolujte typ dat pro COUNT()
EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;
Výsledek (při použití vertikálního výstupu):
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
Ano, je spousta informací, které nepotřebujeme, ale když se podíváte na system_type_name uvidíte, že jeho hodnota je int . To nám říká, že náš dotaz vrátil své výsledky jako int , podle očekávání. Můžete také vidět, že max_length a přesnost hodnoty jsou konzistentní s int datový typ.
Zkontrolujte typ dat pro COUNT_BIG()
V tomto příkladu vše, co musíme udělat, je nahradit COUNT(*)
s COUNT_BIG(*)
:
EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;
Výsledek (při použití vertikálního výstupu):
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
Tentokrát vidíme, že
system_type_name
je
velký
. To nám říká, že naše COUNT_BIG()
dotaz vrátil výsledky jako bigint , podle očekávání.
max_length
a
přesnost
hodnoty jsou také v souladu s bigintem datový typ.
Mimochodem, rychlejší způsob, jak provést výše uvedené, je zkombinovat obě funkce do dotazu při volání uložené procedury.
Takhle:
EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;
To vypíše dva řádky, jeden pro každou funkci v SELECT
prohlášení.