APPROX_COUNT_DISTINCT()
er en af de nye funktioner introduceret i SQL Server 2019. Denne funktion returnerer det omtrentlige antal unikke ikke-nullværdier i en gruppe.
Grundlæggende kan du bruge det til at få en omtrentlig idé om antallet af ikke-duplikerede rækker i en stor tabel eller et resultatsæt. Det virker på samme måde som COUNT_BIG()
og COUNT()
funktioner (når du bruger DISTINCT
klausul), men det returnerer et omtrentligt tal i stedet for et præcist tal.
APPROX_COUNT_DISTINCT()
er primært rettet mod big data-scenarier. Det er designet til at få adgang til store datasæt med mere end en million rækker og aggregering af en eller flere kolonner, der har mange forskellige værdier. Den er beregnet til scenarier, hvor lydhørhed er mere kritisk end absolut præcision.
Microsoft oplyser, at funktionsimplementeringen garanterer en fejlrate på op til 2 % med en sandsynlighed på 97 %.
I skrivende stund, APPROX_COUNT_DISTINCT()
er en offentlig forhåndsvisningsfunktion. Det blev introduceret i SQL Server 2019, som også i øjeblikket er i preview-status.
Bemærk, at Microsoft oplyser, at preview-funktioner ikke er beregnet til produktionsbrug.
Syntaks
Syntaksen ser sådan ud:
APPROX_COUNT_DISTINCT ( udtryk )
Udtrykket kan være af enhver type, undtagen billede , sql_variant , ntekst , eller tekst .
Eksempel 1 – COUNT() mod APPROX_COUNT_DISTINCT
Her er et grundlæggende eksempel, der sammenligner COUNT()
med APPROX_COUNT_DISTINCT()
:
BRUG WideWorldImporters;VÆLG COUNT(OrderLineId) 'Faktisk Count', COUNT(DISTINCT OrderLineId) 'Faktisk Distinct Count', APPROX_COUNT_DISTINCT(OrderLineId) 'Approx Distinct Count'FROM Sales.OrderLResultat:
+----------------+-------------------------+--- ----------------------+| Faktisk optælling | Faktisk distinkt antal | Ca. distinkt antal ||----------------+--------------------------------+-- -----------------------|| 231412 | 231412 | 238493 |+----------------+------------------------+---- ----------------------+I dette tilfælde er det faktiske antal og det faktiske særskilte antal det samme (dette betyder blot, at der ikke var nogen dubletter i OrderLineId kolonne).
Vi ser dog, at
APPROX_COUNT_DISTINCT()
returnerede en anden værdi. Dette kan forventes, da det kun returnerer en tilnærmelse.Eksempel 2 – Et mindre tal
I dette eksempel angiver jeg en anden kolonne ( Beskrivelse ) for at tælle:
VÆLG ANTAL(Beskrivelse) 'Faktisk optælling', ANTAL(DISTINKT Beskrivelse) 'Faktisk distinkt antal', APPROX_COUNT_DISTINCT(Beskrivelse) 'Omtrent distinkt antal'FRA Salg.Ordrelinjer;Resultat:
+----------------+-------------------------+--- ----------------------+| Faktisk optælling | Faktisk distinkt antal | Ca. distinkt antal ||----------------+--------------------------------+-- -----------------------|| 231412 | 227 | 226 |+----------------+------------------------+---- ----------------------+I dette tilfælde er det faktiske antal og det faktiske særskilte antal forskellige. Dette skyldes, at Beskrivelse kolonne indeholder en masse duplikerede værdier.
Vi kan se, at
APPROX_COUNT_DISTINCT()
returnerede stadig en anden værdi, men den er ret tæt på.Som nævnt,
APPROX_COUNT_DISTINCT()
er primært beregnet til større resultatsæt. Mindre resultatsæt som dem her kører hurtigt, uanset hvilken funktion jeg bruger.Tjek datatypen
APPROX_COUNT_DISTINCT()
returnerer sit resultat som en bigint , så i den forbindelse minder det mere omCOUNT_BIG()
end det er tilCOUNT()
(som returnerer en int ). Men lad os bekræfte det:EXEC sp_describe_first_result_set N'SELECT APPROX_COUNT_DISTINCT(OrderLineId) FROM Sales.OrderLines', null, 0;Resultat (ved hjælp af lodret output):
er_skjult | 0column_ordinal | 1 navn | NULLis_nullable | 1system_type_id | 127systemtypenavn | bigintmax_length | 8præcision | 19 skala | 0sorteringsnavn | NULLuser_type_id | NULLuser_type_database | NULLuser_type_schema | NULLuser_type_name | NULLassembly_qualified_type_name | NULLxml_collection_id | NULLxml_samlingsdatabase | NULLxml_samlingsskema | NULLxml_samlingsnavn | NULLis_xml_document | 0er_store og små bogstaver | 0is_fixed_length_clr_type | 0kildeserver | NULLkildedatabase | NULLkildeskema | NULLkildetabel | NULLkildekolonne | NULLis_identity_column | 0is_part_of_unique_key | NULLis_updateable | 0is_computed_column | 0is_sparse_column_set | 0ordinal_in_order_by_list | NULLorden_efter_er_faldende | NULLorder_efter_liste_længde | NULLtds_type_id | 38tds_length | 8tds_collation_id | NULLtds_collation_sort_id | NULLVi kan se det system_type_name er stor . Dette fortæller os, at vores forespørgsel returnerer sine resultater som en bigint datatype, som forventet. max_length og præcision værdier er også i overensstemmelse med bigint datatype.