Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

COUNT() срещу COUNT_BIG() в SQL Server:Каква е разликата?

В 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 изявление.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция в SQL Server 2008, подобна на НАЙ-ГОЛЯМАТА в mysql?

  2. Вземете всички родители за дете

  3. Как COUNT() работи в SQL Server

  4. 3 начина за конвертиране на HEX в INT в SQL Server (T-SQL)

  5. SQL Server 2008 Вертикални данни към хоризонтални