sql >> Databáze >  >> RDS >> Sqlserver

COUNT() vs COUNT_BIG() na SQL Server:Jaký je rozdíl?

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í.


  1. Jak spojit dvě tabulky mysql?

  2. Velká data s PostgreSQL a Apache Spark

  3. Import SSIS Excel Vynucení nesprávného typu sloupce

  4. PostgreSQL Streaming vs Logická replikace – srovnání