Время прочтения: 2 мин.

Работая в SQL Server нам приходится искать в базах данных уникальные значения и, привычно, мы используем для этого COUNT(DISTINCT()). В SQL Server 2019 (15.x) появилась функция для поиска уникальных значений APPROX_COUNT_DISTINCT, которая имеет преимущество при работе с большими данными, в отличии от привычной нам функции.

APPROX_COUNT_DISTINCT возвращает приблизительное количество уникальных значений, но не нагружает память, за счёт использования алгоритма HyperLogLog, который решает проблемы подсчета различных элементов, аппроксимирующий количество отдельных элементов в мультимножестве. Для вычисления точной мощности мультимножества требуется объем памяти, пропорциональный мощности, что непрактично для очень больших данных. В результате требуется меньше времени на выполнение запроса. Использование данной функции будет хорошим инструментом, при большом количестве таблиц, задач и данных.

Инструмент очень удобен для проведения предварительного/итогового анализа больших данных.

Рассмотрим в сравнении работу функций на примере таблицы [obr].[dbo].[Лист] в 60000 строк, для выполнения задачи извлечения из таблицы уникальных значений по столбцу Тех:

  1. COUNT(DISTINCT())
SET STATISTICS TIME ON
SELECT COUNT(DISTINCT Тех) as COUNT_DISTINCT
FROM [obr].[dbo].[Лист]
SET STATISTICS TIME OFF

2. APPROX_COUNT_DISTINCT

SET STATISTICS TIME ON
SELECT APPROX_COUNT_DISTINCT(Тех) AS ApproxCountDistinct
FROM [obr].[dbo].[Лист]
SET STATISTICS TIME OFF

На данном примере видно, что затраченное время при использовании APPROX_COUNT_DISTINCT значительно меньше – 26 против 85 мс.

Таким образом, преимуществом использования данной функции является скорость выполнения запросов и высвобождение дополнительных ресурсов. Недостатком использования можно считать небольшую погрешность до 2% при обработке больших данных, но такая погрешность не критична.