Время прочтения: 2 мин.
Работая в SQL Server нам приходится искать в базах данных уникальные значения и, привычно, мы используем для этого COUNT(DISTINCT()). В SQL Server 2019 (15.x) появилась функция для поиска уникальных значений APPROX_COUNT_DISTINCT, которая имеет преимущество при работе с большими данными, в отличии от привычной нам функции.
APPROX_COUNT_DISTINCT возвращает приблизительное количество уникальных значений, но не нагружает память, за счёт использования алгоритма HyperLogLog, который решает проблемы подсчета различных элементов, аппроксимирующий количество отдельных элементов в мультимножестве. Для вычисления точной мощности мультимножества требуется объем памяти, пропорциональный мощности, что непрактично для очень больших данных. В результате требуется меньше времени на выполнение запроса. Использование данной функции будет хорошим инструментом, при большом количестве таблиц, задач и данных.
Инструмент очень удобен для проведения предварительного/итогового анализа больших данных.
Рассмотрим в сравнении работу функций на примере таблицы [obr].[dbo].[Лист] в 60000 строк, для выполнения задачи извлечения из таблицы уникальных значений по столбцу Тех:
- 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% при обработке больших данных, но такая погрешность не критична.