Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

COUNT () so với COUNT_BIG () trong SQL Server:Sự khác biệt là gì?

Trong SQL Server, COUNT_BIG() và hàm COUNT() về cơ bản làm điều tương tự:trả về số lượng mục được tìm thấy trong một nhóm. Về cơ bản, bạn có thể sử dụng các hàm này để tìm ra có bao nhiêu hàng trong một bảng hoặc tập hợp kết quả.

Trong nhiều trường hợp, bạn có thể chọn bất kỳ cái nào bạn thích. Tuy nhiên, có sự khác biệt giữa hai chức năng này có thể khiến bạn phải sử dụng chức năng này thay vì chức năng kia.

Sự khác biệt là COUNT() trả về kết quả của nó dưới dạng int , trong khi COUNT_BIG() trả về kết quả của nó dưới dạng bigint .

Nói cách khác, bạn sẽ cần sử dụng COUNT_BIG() nếu bạn mong đợi kết quả của nó lớn hơn 2.147.483.647 (tức là nếu truy vấn trả về nhiều hơn 2.147.483.647 hàng).

Ví dụ 1 - Khi COUNT () là OK

Dưới đây là một ví dụ cơ bản cho thấy một tình huống trong đó cả COUNT()COUNT_BIG() có thể được sử dụng:

USE WideWorldImportersDW;
SELECT 
  COUNT(*) AS 'COUNT',
  COUNT_BIG(*) AS 'COUNT_BIG' 
FROM Fact.[Order];

Kết quả:

+---------+-------------+
| COUNT   | COUNT_BIG   |
|---------+-------------|
| 231412  | 231412      |
+---------+-------------+

Chúng ta có thể thấy rằng có 231412 hàng trong Fact. [Order] bảng.

Trong trường hợp này, cả hai hàm đều có thể xử lý vì số lượng hàng đủ nhỏ để được lưu trữ trong int cũng như bigint .

Tuy nhiên, nếu kết quả quá lớn đến mức int không thể lưu trữ nó, khi đó chúng tôi chỉ có thể sử dụng COUNT_BIG() .

Ví dụ 2 - Khi COUNT_BIG () là bắt buộc

Dưới đây là ví dụ về nơi bạn cần sử dụng COUNT_BIG() .

SELECT COUNT_BIG(*) AS 'Row Count' 
FROM ReallyBigTable;

Kết quả:

+-----------------+
| Row Count       |
|-----------------|
| 9147483648      |
+-----------------+

Trong trường hợp này, số hàng quá lớn đến mức int sẽ không thể xử lý nó. May mắn thay, chúng tôi có thể sử dụng COUNT_BIG() , vì nó trả về kết quả là bigint .

Kiểm tra kiểu dữ liệu của cả hai hàm

Khi xem xét các ví dụ trước, chúng tôi thực sự không thể thấy tên loại dữ liệu. Chúng tôi chỉ có thể giả định rằng COUNT() trả về kết quả của nó dưới dạng int COUNT_BIG() sử dụng bigint bởi vì đó là những gì tài liệu của Microsoft nói (mặc dù chúng tôi biết rằng ví dụ thứ hai không thể là int vì giá trị quá lớn đối với int ).

Chúng tôi có thể sử dụng sp_describe_first_result_set thủ tục được lưu trữ để kiểm tra kiểu dữ liệu trả về từng hàm này.

Kiểm tra Loại dữ liệu cho COUNT ()

EXEC sp_describe_first_result_set N'SELECT COUNT(*) FROM Fact.[Order]', null, 0;

Kết quả (sử dụng đầu ra dọc):

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

Có, chúng tôi không cần nhiều thông tin nhưng nếu bạn xem system_type_name , bạn sẽ thấy rằng giá trị của nó là int . Điều này cho chúng tôi biết rằng truy vấn của chúng tôi đã trả về kết quả dưới dạng int , như mong đợi. Bạn cũng có thể thấy rằng max_length precision các giá trị nhất quán với int kiểu dữ liệu.

Kiểm tra Loại dữ liệu cho COUNT_BIG ()

Đối với ví dụ này, tất cả những gì chúng ta cần làm là thay thế COUNT(*) với COUNT_BIG(*) :

EXEC sp_describe_first_result_set N'SELECT COUNT_BIG(*) FROM Fact.[Order]', null, 0;

Kết quả (sử dụng đầu ra dọc):

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

Lần này, chúng ta có thể thấy rằng system_type_name bigint . Điều này cho chúng tôi biết rằng COUNT_BIG() của chúng tôi truy vấn trả về kết quả dưới dạng bigint , như mong đợi. max_length precision các giá trị cũng nhất quán với bigint kiểu dữ liệu.

Nhân tiện, một cách nhanh hơn để thực hiện việc trên là kết hợp cả hai hàm vào truy vấn khi gọi thủ tục được lưu trữ.

Như thế này:

EXEC sp_describe_first_result_set N'SELECT COUNT(*), COUNT_BIG(*) FROM Fact.[Order]', null, 0;

Điều đó sẽ xuất ra hai hàng, một hàng cho mỗi chức năng trong SELECT tuyên bố.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL - Thêm cột vào tất cả các bảng trong cơ sở dữ liệu [Ví dụ về con trỏ]

  2. Hướng dẫn cơ sở dữ liệu SQL Server (MSSQL DBA) cho người mới bắt đầu quản trị cơ sở dữ liệu

  3. EF4 - Thủ tục được lưu trữ đã chọn trả về không có cột nào

  4. Biểu thức chính quy bên trong SQL Server

  5. Cách truyền tham số cho truy vấn mssql trong nút js