sql >> Databáze >  >> RDS >> Sqlserver

Jak funguje APPROX_COUNT_DISTINCT() na serveru SQL Server

APPROX_COUNT_DISTINCT() je jednou z nových funkcí zavedených v SQL Server 2019. Tato funkce vrací přibližný počet jedinečných hodnot bez hodnoty null ve skupině.

V podstatě jej můžete použít k získání přibližné představy o počtu neduplikovaných řádků ve velké tabulce nebo sadě výsledků. Funguje podobně jako COUNT_BIG() a COUNT() funkce (při použití DISTINCT klauzule), ale vrací přibližné číslo, nikoli přesné číslo.

APPROX_COUNT_DISTINCT() je zaměřen hlavně na scénáře velkých dat. Je navržen pro přístup k velkým datovým sadám s více než milionem řádků a agregaci sloupce nebo sloupců, které mají mnoho různých hodnot. Je určen pro scénáře, kde je odezva důležitější než absolutní přesnost.

Microsoft uvádí, že implementace funkce zaručuje až 2% chybovost s pravděpodobností 97%.

V době psaní článku APPROX_COUNT_DISTINCT() je funkce veřejného náhledu. Byl představen v SQL Server 2019, který je také aktuálně ve stavu náhledu.

Všimněte si, že Microsoft uvádí, že funkce náhledu nejsou určeny pro produkční použití.

Syntaxe

Syntaxe vypadá takto:

APPROX_COUNT_DISTINCT ( expression ) 

Výraz může být libovolného typu kromě obrázku , sql_variant , ntext nebo text .

Příklad 1 – COUNT() vs. APPROX_COUNT_DISTINCT

Zde je základní příklad porovnání COUNT() s 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;

Výsledek:

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

V tomto případě je skutečný počet a skutečný odlišný počet stejný (to znamená, že v OrderLineId nebyly žádné duplikáty sloupec).

Vidíme však, že APPROX_COUNT_DISTINCT() vrátil jinou hodnotu. To se dá očekávat, protože vrací pouze přibližnou hodnotu.

Příklad 2 – Menší číslo

V tomto příkladu zadávám jiný sloupec ( Popis ) počítat:

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

Výsledek:

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

V tomto případě se skutečný počet a skutečný odlišný počet liší. Důvodem je Popis obsahuje mnoho duplicitních hodnot.

Vidíme, že APPROX_COUNT_DISTINCT() stále vrátil jinou hodnotu, ale je to docela blízko.

Jak již bylo zmíněno, APPROX_COUNT_DISTINCT() je určen především pro větší výsledkové sady. Menší sady výsledků, jako jsou ty zde, běží rychle bez ohledu na to, kterou funkci používám.

Zkontrolujte typ dat

APPROX_COUNT_DISTINCT() vrátí výsledek jako bigint , takže v tomto ohledu je více podobný COUNT_BIG() než je COUNT() (což vrací int ). Ale pojďme si to potvrdit:

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

Výsledek (při použití vertikálního výstupu):

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

Vidíme, že system_type_name je velký . To nám říká, že náš dotaz vrací výsledky jako bigint datový typ podle očekávání. max_length a přesnost hodnoty jsou také v souladu s bigintem datový typ.


  1. Jak spouštět a spravovat zálohy MySQL pro Oracle DBA

  2. python pip install chyba instalace psycopg2

  3. Omezení flexibility dat v databázi NoSQL

  4. Hromadně vložit částečně citovaný soubor CSV na SQL Server