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.