APPROX_COUNT_DISTINCT()
adalah salah satu fungsi baru yang diperkenalkan di SQL Server 2019. Fungsi ini mengembalikan perkiraan jumlah nilai non-null unik dalam grup.
Pada dasarnya, Anda dapat menggunakannya untuk mendapatkan gambaran perkiraan jumlah baris non-duplikat dalam tabel besar atau kumpulan hasil. Ini bekerja mirip dengan COUNT_BIG()
dan COUNT()
fungsi (saat menggunakan DISTINCT
klausa), tetapi mengembalikan angka perkiraan daripada angka yang tepat.
APPROX_COUNT_DISTINCT()
ditujukan terutama untuk skenario data besar. Ini dirancang untuk mengakses kumpulan data besar dengan lebih dari satu juta baris, dan agregasi kolom atau kolom yang memiliki banyak nilai berbeda. Ini ditujukan untuk skenario di mana daya tanggap lebih penting daripada presisi mutlak.
Microsoft menyatakan bahwa implementasi fungsi menjamin tingkat kesalahan hingga 2% dalam probabilitas 97%.
Pada saat penulisan, APPROX_COUNT_DISTINCT()
adalah fitur pratinjau publik. Itu diperkenalkan di SQL Server 2019, yang juga saat ini dalam status pratinjau.
Perhatikan bahwa Microsoft menyatakan bahwa fitur pratinjau tidak dimaksudkan untuk penggunaan produksi.
Sintaks
Sintaksnya seperti ini:
APPROX_COUNT_DISTINCT ( expression )
Ekspresi dapat berupa jenis apa pun, kecuali gambar , sql_variant , nteks , atau teks .
Contoh 1 – COUNT() vs APPROX_COUNT_DISTINCT
Berikut adalah contoh dasar yang membandingkan COUNT()
dengan APPROX_COUNT_DISTINCT()
:
USE WideWorldImporters; SELECT COUNT(OrderLineId) 'Actual Count', COUNT(DISTINCT OrderLineId) 'Actual Distinct Count', APPROX_COUNT_DISTINCT(OrderLineId) 'Approx Distinct Count' FROM Sales.OrderLines;
Hasil:
+----------------+-------------------------+-------------------------+ | Actual Count | Actual Distinct Count | Approx Distinct Count | |----------------+-------------------------+-------------------------| | 231412 | 231412 | 238493 | +----------------+-------------------------+-------------------------+
Dalam hal ini, penghitungan aktual dan penghitungan nyata yang berbeda adalah sama (ini hanya berarti bahwa tidak ada duplikat di OrderLineId kolom).
Namun, kami melihat bahwa APPROX_COUNT_DISTINCT()
mengembalikan nilai yang berbeda. Ini sudah diduga, karena hanya mengembalikan perkiraan.
Contoh 2 – Angka Lebih Kecil
Dalam contoh ini, saya menentukan kolom yang berbeda ( Deskripsi ) untuk menghitung:
SELECT COUNT(Description) 'Actual Count', COUNT(DISTINCT Description) 'Actual Distinct Count', APPROX_COUNT_DISTINCT(Description) 'Approx Distinct Count' FROM Sales.OrderLines;
Hasil:
+----------------+-------------------------+-------------------------+ | Actual Count | Actual Distinct Count | Approx Distinct Count | |----------------+-------------------------+-------------------------| | 231412 | 227 | 226 | +----------------+-------------------------+-------------------------+
Dalam hal ini, hitungan sebenarnya dan hitungan berbeda yang sebenarnya berbeda. Ini karena Deskripsi kolom berisi banyak nilai duplikat.
Kita dapat melihat bahwa APPROX_COUNT_DISTINCT()
masih mengembalikan nilai yang berbeda, tetapi cukup mendekati.
Seperti disebutkan, APPROX_COUNT_DISTINCT()
terutama ditujukan untuk set hasil yang lebih besar. Kumpulan hasil yang lebih kecil seperti yang ada di sini berjalan dengan cepat terlepas dari fungsi mana yang saya gunakan.
Periksa Jenis Data
APPROX_COUNT_DISTINCT()
mengembalikan hasilnya sebagai besar , jadi dalam hal itu lebih mirip dengan COUNT_BIG()
daripada ke COUNT()
(yang mengembalikan int ). Tapi mari kita pastikan bahwa:
EXEC sp_describe_first_result_set N'SELECT APPROX_COUNT_DISTINCT(OrderLineId) FROM Sales.OrderLines', 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
Kita dapat melihat bahwa system_type_name adalah besar . Ini memberi tahu kami bahwa kueri kami mengembalikan hasilnya sebagai besar tipe data, seperti yang diharapkan. panjang_maks dan presisi nilai juga konsisten dengan besar tipe data.