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 тип данни.