String,
userId String,
date Date
)
ENGINE = MergeTree(date, (userId, docId), 8192)
Данных в таблице ~67 миллионов
Запрос:
SELECT COUNT(DISTINCT(userId))
FROM test
WHERE docId IN
(SELECT DISTINCT docId
FROM test
WHERE userId = '7682068d-a33f-4226-9f63-a301c97c3e26'
AND NOT docId = 'n/a'
AND NOT docId = ''
AND docId IS NOT NULL)
AND userId IS NOT NULL
AND NOT userId = ''
AND NOT userId = '7682068d-a33f-4226-9f63-a301c97c3e26'
Проблема: выполнение запроса в среднем ~20-25 секунд
(Вопрос - Как сделать выполнение запроса быстрее?)
К примеру отдельный запрос:
SELECT DISTINCT docId
FROM test
WHERE userId = '7682068d-a33f-4226-9f63-a301c97c3e26'
AND NOT docId = 'n/a'
AND NOT docId = ''
AND docId IS NOT NULL
Выполнение - 0.021 sec.
Другой запрос:
SELECT COUNT(DISTINCT(userId)) FROM test WHERE docId IN ('Berkshire', 'Avon')
Выполнение ~8-9 sec.
Что пробовал?
- Secondary Indexes (ADD INDEX). Возможно пробовал криво
- MergeTree(date, (userId), 8192)
- MergeTree(date, (docId), 8192)
- MergeTree(date, (docId, userId), 8192)
(работаю редко с КХ; неопытный; спасибо за помощь)
SELECT uniqCombined(userId) FROM test WHERE ... GROUP BY docId
SELECT COUNT(DISTINCT(userId)) FROM test PREWHERE docId IN (SELECT DISTINCT docId FROM test WHERE userId = '7682068d-a33f-4226-9f63-a301c97c3e26' AND NOT docId = 'n/a' AND NOT docId = '' AND docId IS NOT NULL) WHERE userId IS NOT NULL AND NOT userId = '' AND NOT userId = '7682068d-a33f-4226-9f63-a301c97c3e26' без двух таблиц отсортированных по разному (да данные будут хранится два раза) такое не исправить. И вообще надо брать постре или мускуль для таких задач, КХ тут как слон на кухне
Обсуждают сегодня