Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как работи APPROX_COUNT_DISTINCT() в SQL Server

APPROX_COUNT_DISTINCT() е една от новите функции, въведени в SQL Server 2019. Тази функция връща приблизителния брой уникални ненулеви стойности в група.

По принцип можете да го използвате, за да получите приблизителна представа за броя на недублиращите се редове в голяма таблица или набор от резултати. Работи подобно на COUNT_BIG() и COUNT() функции (когато използвате DISTINCT клауза), но връща приблизително число, а не точно число.

APPROX_COUNT_DISTINCT() е насочена главно към сценарии с големи данни. Той е предназначен за достъп до големи набори от данни с повече от милион реда и агрегиране на колона или колони, които имат много различни стойности. Предназначен е за сценарии, при които отзивчивостта е по-критична от абсолютната прецизност.

Microsoft заявява, че внедряването на функцията гарантира до 2% процент грешки в рамките на 97% вероятност.

Към момента на писане, APPROX_COUNT_DISTINCT() е функция за публичен преглед. Той беше въведен в SQL Server 2019, който в момента също е в състояние на предварителен преглед.

Имайте предвид, че Microsoft заявява, че функциите за предварителен преглед не са предназначени за производствена употреба.

Синтаксис

Синтаксисът е така:

APPROX_COUNT_DISTINCT (израз) 

Изразът може да бъде от всякакъв тип, освен изображение , sql_variant , ntext , или текст .

Пример 1 – COUNT() срещу APPROX_COUNT_DISTINCT

Ето основен пример за сравняване на COUNT() с APPROX_COUNT_DISTINCT() :

ИЗПОЛЗВАЙТЕ WideWorldImporters;SELECT COUNT(OrderLineId) 'Действителен брой', COUNT(DISTINCT OrderLineId) 'Действителен отличен брой', APPROX_COUNT_DISTINCT(OrderLineId) 'Приблизителен различен брой. 

Резултат:

+----------------+-----------------------+--- ---------------------+| Действителен брой | Действителен отделен брой | Приблизителен различен брой ||----------------+------------------------+-- -----------------------|| 231412 | 231412 | 238493 |+----------------+-----------------------+---- ---------------------+

В този случай действителният брой и действителният отделен брой са еднакви (това просто означава, че не е имало дубликати в OrderLineId колона).

Виждаме обаче, че APPROX_COUNT_DISTINCT() върна различна стойност. Това може да се очаква, тъй като връща само приблизително.

Пример 2 – По-малко число

В този пример посочвам различна колона ( Описание ) за броене:

SELECT COUNT(Описание) 'Действителен брой', COUNT(DISTINCT описание) 'Действителен отделен брой', APPROX_COUNT_DISTINCT(описание) 'Приблизителен различен брой'FROM Sales.OrderLines;

Резултат:

+----------------+-----------------------+--- ---------------------+| Действителен брой | Действителен отделен брой | Приблизителен различен брой ||----------------+------------------------+-- -----------------------|| 231412 | 227 | 226 |+----------------+-----------------------+---- ---------------------+

В този случай действителният брой и действителният отделен брой са различни. Това е така, защото Описание колоната съдържа много дублиращи се стойности.

Можем да видим, че APPROX_COUNT_DISTINCT() все още връща различна стойност, но е доста близка.

Както бе споменато, APPROX_COUNT_DISTINCT() е предназначен главно за по-големи набори от резултати. По-малките набори от резултати като тези тук се изпълняват бързо, независимо коя функция използвам.

Проверете типа данни

APPROX_COUNT_DISTINCT() връща резултата си като голям , така че в това отношение е по-подобен на COUNT_BIG() отколкото е към COUNT() (който връща int ). Но нека потвърдим това:

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

Резултат (с помощта на вертикален изход):

е_скрит | 0ред_колона | 1 име | NULLis_nullable | 1system_type_id | 127 име_тип_на_система | bigintmax_length | 8прецизност | 19 мащаб | 0име_на_колекция | NULLuser_type_id | NULLuser_type_database | NULL_тип_схема_на_потребител | NULL_тип_на_потребител | NULLиме_квалифициран_тип_на_събиране | NULLxml_collection_id | NULLxml_collection_database | NULLxml_collection_schema | NULLxml_collection_name | NULLis_xml_document | 0is_case_sensitive | 0is_fixed_length_clr_type | 0source_server | NULL изходна_база от данни | NULL изходна_схема | NULL изходна_таблица | NULLизточна_колона | NULLis_identity_column | 0е_част_от_уникалния_ключ | NULL е_подлежащ на актуализация | 0е_изчислена_колона | 0is_sparse_column_set | 0порядков_в_порядък_по_списък | NULL подреждане_по_низходящо | NULL подреждане_по_дължина_списък | NULLtds_type_id | 38tds_length | 8tds_collation_id | NULLtds_collation_sort_id | NULL

Можем да видим, че system_type_name е голям . Това ни казва, че нашата заявка връща резултатите си като bigint тип данни, както се очаква. max_length и прецизност стойностите също са в съответствие с bigint тип данни.


  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 чрез PDO с помощта на драйвер на SQL Server

  2. Ограничение на клаузата IN в Sql Server

  3. SQL Server FOR XML Path прави повтарящи се възли

  4. Как да промените модела за възстановяване на база данни на SQL Server с помощта на T-SQL

  5. Как да инсталирате SQL Server Manager Studio (SSMS) - SQL Server / TSQL урок, част 1