Странное поведение SELECT

211 views
Skip to first unread message

Dmitry Berezhnov

unread,
May 18, 2017, 10:43:19 AM5/18/17
to ClickHouse
Приветствую.
Есть запрос вида
SELECT * FROM prodstat WHERE `mark#string` = 'site dateEdit was changed' LIMIT 1

Результат
http://joxi.ru/5md5p0bhv4ldP2

Судя по выводу строки "Progress", что обработано 1.65 Мб - что-то тут не так.
Конфиг ClickHouse по лимитам query
http://joxi.ru/Vm6levJCxVNYXA

ClickHouse client version 1.1.54231.
Connecting to localhost:9000.
Connected to ClickHouse server version 1.1.5423

Что я делаю не так?
Объем данных таблицы prodstat примерно 600 Мб

Николай Кочетов

unread,
May 18, 2017, 11:49:22 AM5/18/17
to ClickHouse
Добрый день!

Возможно, это баг. На скриншоте с результатом обрезалось значение в строке (attempt to allocate chunk of <?> bytes). Не могли бы Вы уточнить это значение?
Также, если не секрет, хотелось бы увидеть результат
SHOW CREATE TABLE prodstat


четверг, 18 мая 2017 г., 17:43:19 UTC+3 пользователь Dmitry Berezhnov написал:

Dmitry Berezhnov

unread,
May 19, 2017, 4:34:55 AM5/19/17
to ClickHouse
Вот другой скрин http://joxi.ru/a2XEyx8ty0vzNA.
Запрос каждый раз ругается на разные столбцы.
Структура таблицы очень развесистая, больше 1к колонок. Так получилось, поскольку я пытаюсь "расплющить" json-лог на структуру таблицы в ClickHouse (логи слабо структуированы, потому так много колонок).
Я пока попробую использовать дефотный конфиг, может быть дело в нем.

Dmitry Berezhnov

unread,
May 19, 2017, 5:00:22 AM5/19/17
to ClickHouse
Возможно важное уточнение: после перезапуска сервера, запрос выполняется один раз, после чего начинает возвращать ошибку (проверить на дефолтном конфиге)

Николай Кочетов

unread,
May 24, 2017, 11:48:02 AM5/24/17
to ClickHouse
Проблема может быть из-за слишком длинных строк в таблице. По умолчанию, размер блока max_block_size = 65536, и он может не влезать в ограничения по памяти. Попробуйте поставить max_block_size = 8192.

Также можете попробовать выставить настройку preferred_block_size_bytes.

пятница, 19 мая 2017 г., 12:00:22 UTC+3 пользователь Dmitry Berezhnov написал:

a...@imagespark.ru

unread,
May 25, 2017, 12:38:11 PM5/25/17
to ClickHouse
Я тоже столкнулся со странным поведением select запроса.

Вот запрос который отрабатывает как следует:

SELECT *
FROM
(
    SELECT
        learnerHash,
        passed - eventTime AS diff
    FROM statements
    GLOBAL ANY INNER JOIN
    (
        SELECT
            learnerHash,
            argMax(eventTime, resultScoreRaw) AS passed
        FROM
        (
            SELECT
                learnerHash,
                eventTime,
                resultScoreRaw
            FROM statements
            PREWHERE (courseId = 1) AND (onCourse = 0)
            WHERE (verb = 'http://adlnet.gov/expapi/verbs/passed') AND (objectId = 'https://crmm.ru/xapi/courses/spp/1/1/0-1')
            ORDER BY eventTime ASC
        )
        GROUP BY learnerHash
    ) USING (learnerHash)
    PREWHERE (courseId = 1) AND (onCourse = 0)
    WHERE (verb = 'http://adlnet.gov/expapi/verbs/interacted') AND (eventTime <= passed) AND (diff > 0)
    ORDER BY eventTime DESC
    LIMIT 1 BY learnerHash
)
ORDER BY diff DESC
LIMIT 7, 126

А вот запрос который кидается ошибкой Not found column learnerHash in block. There are only columns: diff

SELECT avg(diff)
FROM
(
    SELECT *
    FROM
    (
        SELECT
            learnerHash,
            passed - eventTime AS diff
        FROM statements
        GLOBAL ANY INNER JOIN
        (
            SELECT
                learnerHash,
                argMax(eventTime, resultScoreRaw) AS passed
            FROM
            (
                SELECT
                    learnerHash,
                    eventTime,
                    resultScoreRaw
                FROM statements
                PREWHERE (courseId = 1) AND (onCourse = 0)
                WHERE (verb = 'http://adlnet.gov/expapi/verbs/passed') AND (objectId = 'https://crmm.ru/xapi/courses/spp/1/1/0-1')
                ORDER BY eventTime ASC
            )
            GROUP BY learnerHash
        ) USING (learnerHash)
        PREWHERE (courseId = 1) AND (onCourse = 0)
        WHERE (verb = 'http://adlnet.gov/expapi/verbs/interacted') AND (eventTime <= passed) AND (diff > 0)
        ORDER BY eventTime DESC
        LIMIT 1 BY learnerHash
    )
    ORDER BY diff DESC
    LIMIT 7, 126
)

В чем проблема не понимаю.
Message has been deleted

Николай Кочетов

unread,
May 25, 2017, 3:35:09 PM5/25/17
to ClickHouse
Здесь есть шанс, что ClickHouse неправильно соптимизировал запрос, отбросив learnerHash во внешнем запросе.

Интересно, как сработает такой запрос:

SELECT avg(diff), count(learnerHash)
четверг, 25 мая 2017 г., 19:38:11 UTC+3 пользователь a...@imagespark.ru написал:

a...@imagespark.ru

unread,
May 25, 2017, 3:36:36 PM5/25/17
to ClickHouse
Хм...сработало! Спасибо огромное, а то я уже начал костылять запросы и пробовать разные варианты.
Можете подсказать почему такое возникает, что бы в будущем с подобными проблемами не сталкиваться?

четверг, 25 мая 2017 г., 22:35:09 UTC+3 пользователь Николай Кочетов написал:

Николай Кочетов

unread,
May 26, 2017, 9:58:00 AM5/26/17
to ClickHouse
Точно утверждать не могу, но предполагаю, что без указания learnerHash во внешнем запросе, внутренний SELECT * FROM (...) преобразовался, условно, в SELECT diff FROM (...). Аналогично, 


       SELECT
            learnerHash,
            passed - eventTime AS diff
        FROM statements
        GLOBAL ANY INNER JOIN
        ( ... ) USING (learnerHash)

преобразовался к 

       SELECT
            passed - eventTime AS diff
        FROM statements
        GLOBAL ANY INNER JOIN
        ( ... ) USING (learnerHash)

на что и поругался JOIN. Это, вероятно, баг ClickHouse, а Ваш запрос должен был сработать.

четверг, 25 мая 2017 г., 22:36:36 UTC+3 пользователь a...@imagespark.ru написал:

a...@imagespark.ru

unread,
Jun 1, 2017, 4:19:28 AM6/1/17
to ClickHouse
Блин, эта штука не дает покоя (
Считаем отклонение по медиане, а стандартная функция stddevSamp считает отклонение по среднему, а у нас есть часть битых данных из-за чего приходится пользоваться медианой.
Дак вот из-за того, что КХ отбрасывает колонку learnerHash, приходится считать на прикладном уровне, что значительно увеличивает время построения отчета :(

Подскажите, этот кейс вообще есть в планах исправить? И на сколько он критичный?

четверг, 18 мая 2017 г., 17:43:19 UTC+3 пользователь Dmitry Berezhnov написал:
Reply all
Reply to author
Forward
0 new messages