Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

COUNT() vs COUNT_BIG() di SQL Server:Apa Bedanya?

Di SQL Server, COUNT_BIG() fungsi dan COUNT() melakukan hal yang pada dasarnya sama:mengembalikan jumlah item yang ditemukan dalam grup. Pada dasarnya, Anda dapat menggunakan fungsi ini untuk mengetahui berapa banyak baris dalam tabel atau kumpulan hasil.

Dalam banyak kasus, Anda akan dapat memilih mana yang Anda inginkan. Namun, ada perbedaan antara kedua fungsi ini yang mungkin mengharuskan Anda untuk menggunakan salah satunya.

Perbedaannya adalah COUNT() mengembalikan hasilnya sebagai int , sedangkan COUNT_BIG() mengembalikan hasilnya sebagai besar .

Dengan kata lain, Anda harus menggunakan COUNT_BIG() jika Anda mengharapkan hasilnya lebih besar dari 2.147.483.647 (yaitu jika kueri mengembalikan lebih dari 2.147.483.647 baris).

Contoh 1 – Ketika COUNT() OK

Berikut adalah contoh dasar yang menunjukkan skenario di mana keduanya COUNT() dan COUNT_BIG() dapat digunakan:

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

Hasil:

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

Kita dapat melihat bahwa ada 231412 baris di Fact.[Order] tabel.

Dalam hal ini, kedua fungsi dapat menanganinya, karena jumlah baris cukup kecil untuk disimpan dalam int serta besar .

Namun, jika hasilnya sangat besar sehingga int tidak dapat menyimpannya, maka kami hanya dapat menggunakan COUNT_BIG() .

Contoh 2 – Ketika COUNT_BIG() Diperlukan

Berikut adalah contoh di mana Anda perlu menggunakan COUNT_BIG() .

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

Hasil:

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

Dalam hal ini, jumlah baris sangat besar sehingga int tidak akan bisa mengatasinya. Untungnya kita bisa menggunakan COUNT_BIG() , karena mengembalikan hasilnya sebagai besar .

Memeriksa Tipe Data Kedua Fungsi

Ketika kita melihat contoh sebelumnya, kita tidak dapat benar-benar melihat nama tipe data. Kami hanya dapat berasumsi bahwa COUNT() mengembalikan hasilnya sebagai int dan COUNT_BIG() menggunakan besar karena itulah yang dikatakan dokumentasi Microsoft (walaupun kami tahu bahwa contoh kedua tidak boleh berupa int karena nilainya terlalu besar untuk sebuah int ).

Kita dapat menggunakan sp_describe_first_result_set prosedur tersimpan untuk memeriksa tipe data pengembalian masing-masing fungsi ini.

Periksa Tipe Data untuk COUNT()

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

Hasil (menggunakan keluaran vertikal):

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

Ya, ada banyak info yang tidak kami butuhkan, tetapi jika Anda melihat system_type_name kolom, Anda akan melihat bahwa nilainya adalah int . Ini memberi tahu kami bahwa kueri kami mengembalikan hasilnya sebagai int , seperti yang diharapkan. Anda juga dapat melihat bahwa max_length dan presisi nilai konsisten dengan int tipe data.

Periksa Jenis Data untuk COUNT_BIG()

Untuk contoh ini, yang perlu kita lakukan hanyalah mengganti COUNT(*) dengan COUNT_BIG(*) :

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

Hasil (menggunakan keluaran vertikal):

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

Kali ini kita dapat melihat bahwa system_type_name adalah besar . Ini memberitahu kita bahwa COUNT_BIG() kueri mengembalikan hasilnya sebagai besar , seperti yang diharapkan. max_length dan presisi nilai juga konsisten dengan besar tipe data.

Omong-omong, cara yang lebih cepat untuk melakukan hal di atas adalah dengan menggabungkan kedua fungsi ke dalam kueri saat memanggil prosedur tersimpan.

Seperti ini:

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

Itu akan menampilkan dua baris, satu untuk setiap fungsi di SELECT pernyataan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan garis bujur dan garis lintang terdekat dari tabel database MSSQL?

  2. Ukuran maksimum untuk Kueri SQL Server? klausa IN? Apakah ada Pendekatan yang Lebih Baik?

  3. Membandingkan tanggal yang disimpan sebagai varchar

  4. Jalankan sp_msforeachdb dalam aplikasi Java

  5. SQL Server - Tabel PIVOT Dinamis - Injeksi SQL