Я хочу использовать ClickHouse для маркетинга. В большинстве случаев они хотят знать не просто, КАК многие люди используют ту или иную функцию, но и точные электронные письма, на которые следует рассылать спам. Является ли это хорошим выбором для использования ClickHouse для этой цели (выберите DISTINCT email from table where ...)? В чем разница в производительности между командами select COUNT и select DISTINCT?
«Отдельно» - обычная операция для ClickHouse?
Ответы (1)
Это хороший выбор, чтобы использовать ClickHouse для этой цели?
Да, в ClickHouse есть достойные реализации HashTable и Aggregator. Он широко использует шаблонный код для диспетчеризации статических типов и применяет множество уловок с памятью. И хранит данные в компактном виде.
Я предполагаю, что вы хотите сравнить select count
и select count(distinct)
, поскольку select distinct
другой зверь. ClickHouse преобразует count(distinct)
в агрегатор uniqExact
, который примерно в 8 раз медленнее, чем count(*)
, но все же намного быстрее традиционных баз данных, таких как Postgres. Существуют также приблизительные агрегаторы uniq
, uniqCombined
и uniqHLL12
для более быстрой оценки, что примерно в 1,5 раза медленнее, чем count(*)
. См. https://clickhouse.yandex/docs/en/query_language/agg_functions/reference/, если вам нужна дополнительная информация.
Если ваша цель - select distinct
, ClickHouse все равно может с этим справиться, который использует структуру данных Set
для унификации потоков данных (Set
также используется для построения своей in (...)
конструкции SQL). Без измерения процесса вывода данных он всего в 1,3 раза медленнее обычного count(*)
.