APPROX_COUNT_DISTINCT()
là một trong những hàm mới được giới thiệu trong SQL Server 2019. Hàm này trả về số gần đúng các giá trị không rỗng duy nhất trong một nhóm.
Về cơ bản, bạn có thể sử dụng nó để có được ý tưởng gần đúng về số lượng hàng không trùng lặp trong một bảng lớn hoặc tập hợp kết quả. Nó hoạt động tương tự như COUNT_BIG()
và COUNT()
(khi sử dụng DISTINCT
), nhưng nó trả về một số gần đúng thay vì một số chính xác.
APPROX_COUNT_DISTINCT()
chủ yếu nhằm vào các kịch bản dữ liệu lớn. Nó được thiết kế để truy cập các tập dữ liệu lớn với hơn một triệu hàng và tổng hợp các cột hoặc các cột có nhiều giá trị riêng biệt. Nó dành cho các tình huống mà khả năng phản hồi quan trọng hơn độ chính xác tuyệt đối.
Microsoft tuyên bố rằng việc triển khai chức năng đảm bảo tỷ lệ lỗi lên đến 2% trong xác suất 97%.
Tại thời điểm viết bài, APPROX_COUNT_DISTINCT()
là một tính năng xem trước công khai. Nó đã được giới thiệu trong SQL Server 2019, hiện cũng đang ở trạng thái xem trước.
Lưu ý rằng Microsoft tuyên bố rằng các tính năng xem trước không dành cho mục đích sử dụng sản xuất.
Cú pháp
Cú pháp như sau:
APPROX_COUNT_DISTINCT ( expression )
Biểu thức có thể thuộc bất kỳ loại nào, ngoại trừ hình ảnh , sql_variant , ntext hoặc văn bản .
Ví dụ 1 - COUNT () so với APPROX_COUNT_DISTINCT
Đây là một ví dụ cơ bản so sánh COUNT()
với 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;
Kết quả:
+----------------+-------------------------+-------------------------+ | Actual Count | Actual Distinct Count | Approx Distinct Count | |----------------+-------------------------+-------------------------| | 231412 | 231412 | 238493 | +----------------+-------------------------+-------------------------+
Trong trường hợp này, số lượng thực tế và số lượng riêng biệt thực tế là như nhau (điều này chỉ có nghĩa là không có bản sao nào trong OrderLineId cột).
Tuy nhiên, chúng tôi thấy rằng APPROX_COUNT_DISTINCT()
đã trả về một giá trị khác. Điều này được mong đợi, vì nó chỉ trả về giá trị gần đúng.
Ví dụ 2 - Một số nhỏ hơn
Trong ví dụ này, tôi chỉ định một cột khác ( Mô tả ) để tính:
SELECT COUNT(Description) 'Actual Count', COUNT(DISTINCT Description) 'Actual Distinct Count', APPROX_COUNT_DISTINCT(Description) 'Approx Distinct Count' FROM Sales.OrderLines;
Kết quả:
+----------------+-------------------------+-------------------------+ | Actual Count | Actual Distinct Count | Approx Distinct Count | |----------------+-------------------------+-------------------------| | 231412 | 227 | 226 | +----------------+-------------------------+-------------------------+
Trong trường hợp này, số lượng thực tế và số lượng phân biệt thực tế là khác nhau. Điều này là do Mô tả cột chứa nhiều giá trị trùng lặp.
Chúng ta có thể thấy rằng APPROX_COUNT_DISTINCT()
vẫn trả về một giá trị khác, nhưng nó khá gần.
Như đã đề cập, APPROX_COUNT_DISTINCT()
chủ yếu dành cho các tập kết quả lớn hơn. Các tập hợp kết quả nhỏ hơn như tập hợp ở đây chạy nhanh chóng bất kể tôi sử dụng chức năng nào.
Kiểm tra loại dữ liệu
APPROX_COUNT_DISTINCT()
trả về kết quả của nó dưới dạng bigint , vì vậy về mặt đó, nó giống với COUNT_BIG()
hơn là COUNT()
(trả về một int ). Nhưng hãy xác nhận rằng:
EXEC sp_describe_first_result_set N'SELECT APPROX_COUNT_DISTINCT(OrderLineId) FROM Sales.OrderLines', 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
Chúng ta có thể thấy rằng system_type_name là bigint . Đ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 bigint kiểu dữ liệu, như mong đợi. max_length và precision các giá trị cũng nhất quán với bigint kiểu dữ liệu.