Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak APPROX_COUNT_DISTINCT() działa w SQL Server

APPROX_COUNT_DISTINCT() to jedna z nowych funkcji wprowadzonych w SQL Server 2019. Ta funkcja zwraca przybliżoną liczbę unikalnych wartości innych niż null w grupie.

Zasadniczo można go użyć, aby uzyskać przybliżony obraz liczby niezduplikowanych wierszy w dużej tabeli lub zestawie wyników. Działa podobnie do COUNT_BIG() i COUNT() funkcje (przy użyciu DISTINCT klauzula), ale zwraca przybliżoną liczbę, a nie dokładną liczbę.

APPROX_COUNT_DISTINCT() jest ukierunkowany głównie na scenariusze big data. Jest przeznaczony do uzyskiwania dostępu do dużych zestawów danych zawierających ponad milion wierszy oraz agregacji kolumny lub kolumn, które mają wiele różnych wartości. Jest przeznaczony do scenariuszy, w których czas reakcji jest bardziej krytyczny niż absolutna precyzja.

Microsoft twierdzi, że implementacja funkcji gwarantuje do 2% wskaźnik błędów z 97% prawdopodobieństwem.

W chwili pisania tego tekstu APPROX_COUNT_DISTINCT() to publiczna funkcja podglądu. Został wprowadzony w SQL Server 2019, który również jest obecnie w stanie podglądu.

Pamiętaj, że Microsoft twierdzi, że funkcje podglądu nie są przeznaczone do użytku produkcyjnego.

Składnia

Składnia wygląda tak:

APPROX_COUNT_DISTINCT ( expression ) 

Wyrażenie może być dowolnego typu, z wyjątkiem obrazu , sql_variant , ntekst lub tekst .

Przykład 1 – COUNT() a APPROX_COUNT_DISTINCT

Oto prosty przykład porównujący COUNT() z 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;

Wynik:

+----------------+-------------------------+-------------------------+
| Actual Count   | Actual Distinct Count   | Approx Distinct Count   |
|----------------+-------------------------+-------------------------|
| 231412         | 231412                  | 238493                  |
+----------------+-------------------------+-------------------------+

W tym przypadku rzeczywista liczba i rzeczywista liczba odrębnych elementów są takie same (oznacza to po prostu, że nie było duplikatów w OrderLineId kolumna).

Widzimy jednak, że APPROX_COUNT_DISTINCT() zwrócił inną wartość. Należy się tego spodziewać, ponieważ zwraca tylko przybliżenie.

Przykład 2 – Mniejsza liczba

W tym przykładzie określam inną kolumnę ( Opis ) liczyć:

SELECT 
  COUNT(Description) 'Actual Count',
  COUNT(DISTINCT Description) 'Actual Distinct Count',
  APPROX_COUNT_DISTINCT(Description) 'Approx Distinct Count'
FROM Sales.OrderLines;

Wynik:

+----------------+-------------------------+-------------------------+
| Actual Count   | Actual Distinct Count   | Approx Distinct Count   |
|----------------+-------------------------+-------------------------|
| 231412         | 227                     | 226                     |
+----------------+-------------------------+-------------------------+

W tym przypadku rzeczywista liczba i rzeczywista liczba odrębna są różne. Dzieje się tak, ponieważ Opis kolumna zawiera wiele zduplikowanych wartości.

Widzimy, że APPROX_COUNT_DISTINCT() nadal zwraca inną wartość, ale jest całkiem blisko.

Jak wspomniano, APPROX_COUNT_DISTINCT() jest przeznaczony głównie do większych zestawów wyników. Mniejsze zestawy wyników, takie jak te tutaj, działają szybko, niezależnie od używanej funkcji.

Sprawdź typ danych

APPROX_COUNT_DISTINCT() zwraca swój wynik jako bigin , więc pod tym względem jest bardziej podobny do COUNT_BIG() niż do COUNT() (co zwraca int ). Ale potwierdźmy to:

EXEC sp_describe_first_result_set N'SELECT APPROX_COUNT_DISTINCT(OrderLineId) FROM Sales.OrderLines', null, 0;

Wynik (przy użyciu wyjścia pionowego):

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

Widzimy, że system_type_name jest duży . To mówi nam, że nasze zapytanie zwraca wyniki jako duże typ danych, zgodnie z oczekiwaniami. max_length i precyzja wartości są również zgodne z bigint typ danych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server — Usuń wszystkie niedrukowalne znaki ASCII

  2. 2 sposoby na zwrócenie nazwy serwera w SQL Server (T-SQL)

  3. Jaka jest maksymalna liczba znaków dla NVARCHAR(MAX)?

  4. Funkcja SQL Server ROUND():do czego służy i dlaczego powinno cię to obchodzić?

  5. Konwertuj „smalldatetime” na „date” w SQL Server (przykłady T-SQL)