млн записей не могу выполнить запрос:
SELECT count(DISTINCT transactionId)
FROM transactions
WHERE cardId > 0
GROUP BY transactionId;
Ошибка: DB::Exception: Memory limit (total) exceeded: would use 3.67 GiB (attempt to allocate chunk of 268435464 bytes), maximum: 3.60 GiB: While executing ConvertingAggregatedToChunksTransform. (MEMORY_LIMIT_EXCEEDED) (version 21.12.2.17 (official build))
Нужно получить количество уникальных transactionId c заполненным cardId. Как-то можно оптимизировать запрос или таблицу, чтобы получить приемлемое потребление памяти? Таблица может быть и 100 млрд записей.
> maximum: 3.60 GiB у вас какая-то хилая машинка. distinct требует создания списка всех значений, для этого нужна память. По умолчанию он использует uniqExact. Если вам не нужна высокая точность - попробуйте приближенные варианты uniq - https://clickhouse.com/docs/ru/operations/settings/settings/#settings-count_distinct_implementation
Какой тип данных у transactionId Потому даже uniqExact на строках использует sipHash128 (емнип) с ненулевым шансом коллизии:) (но жутко маленьким, да)
я из лучших побуждений :) а так, у нас есть поле для collision detection(detected 😜)что и другим рекомендую
UInt32. Но есть вероятность, что вырастет и до UInt64.
Можно осторожно попробовать groupBitmap вместо uniqExact В некоторых случаях быстрее работает.
Обсуждают сегодня