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

Cách APPROX_COUNT_DISTINCT () hoạt động trong SQL Server

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()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 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 precision các giá trị cũng nhất quán với bigint kiểu dữ liệu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm trong SQL Server 2008 tương tự như hàm GREATEST trong mysql?

  2. Làm cách nào để chuyển đổi tích tắc sang định dạng ngày tháng?

  3. Cách xóa khoảng trắng theo sau trong SQL Server - RTRIM ()

  4. Cập nhật Dữ liệu Salesforce bằng Con trỏ Máy chủ SQL

  5. 2 cách trả về danh sách máy chủ được liên kết trong SQL Server bằng T-SQL