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

Bagaimana APPROX_COUNT_DISTINCT() Bekerja di SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bulan antara dua tanggal

  2. Cara mendeteksi dan mencegah pertumbuhan tak terduga dari database SQL Server TempDB

  3. Mengonversi hasil Pilih menjadi skrip Sisipkan - SQL Server

  4. Berapa karakter maksimum untuk NVARCHAR(MAX)?

  5. Cara Membuat Skrip DDL (Buat) dari SQL Server Management Studio (SSMS) - Tutorial SQL Server / TSQL Bagian 17