sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fungerer APPROX_COUNT_DISTINCT() i SQL Server

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.OrderL 

Resultat:

+----------------+-------------------------+--- ----------------------+| 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 om COUNT_BIG() end det er til COUNT() (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 | NULL

Vi 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.


  1. Forskellige måder at bruge SQL CONVERT date-funktionen på

  2. Installation af SQL Server Failover Cluster Instance – Del 1

  3. 2019 Databasetrends – SQL vs. NoSQL, Topdatabaser, Enkelt vs. Multiple Databasebrug

  4. Forespørgselsydelsesoptimering i MySQL