Size: a a a

ClickHouse не тормозит

2021 March 02

DT

Dmitry Titov in ClickHouse не тормозит
Виктор
Добрый день. Подскажите как оптимизировать выборку через aggregatingmergetree?

Есть таблица logs(datetime, host, url, response_time) order by (host, datetime)
И такой запрос:
select host, url, sum(response_time), avg(response_time), count(1) from logs where datetime > now - interval 1 hour group by host, url

Я понимаю как сделать таблицу с aggregating merge tree без учета datetime - то есть просто накопительная информация за все время
А хотелось бы получать информацию суммарно за последний час

Есть вариант добавить колонку toYYYYMMDDHH(datetime) в примак, но тогда не будет возможности получать информацию по времени не кратном часу, то есть, например, с 13:36 до 14:36
Ну тут либо шашечки, либо ехать
смысл aggregating merge tree  в том, что бы агрегировать и уменьшать кол-во строк в разы и ускорять сканирование таблицы. Если вам интересны только почасовые агрегации то делаете в MV toStartOfHour(ts) as ts и храните почасовые.
источник

DT

Dmitry Titov in ClickHouse не тормозит
Если вам интересны поминутные агрегации, то делаетe toStartOfMinute(), но тогда и данных будет в 60 раз больше и запросы медленнее
источник

В

Виктор in ClickHouse не тормозит
Понял, спасибо
источник

DK

Dmitry Krylov in ClickHouse не тормозит
А почему вот такая последовательность запросов может приводить к зависанию клиента?

create table t (x Int64, y Int64) engine = MergeTree order by x;
insert into t values (1,10), (5, 10), (6, 20);
alter table t update y = (select max(x) from t) where x > 3;

select * from t; -- < вот тут зависает


?
источник

DK

Dmitry Krylov in ClickHouse не тормозит
И, главное, таблицу t нельзя дропнуть -- тоже зависает
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Можно как-то дропнуть такую таблицу?
источник

KS

Konstantin Sevastian... in ClickHouse не тормозит
Dmitry Krylov
А почему вот такая последовательность запросов может приводить к зависанию клиента?

create table t (x Int64, y Int64) engine = MergeTree order by x;
insert into t values (1,10), (5, 10), (6, 20);
alter table t update y = (select max(x) from t) where x > 3;

select * from t; -- < вот тут зависает


?
посмотрите что с ней происходит в system.mutations
источник

DK

Dmitry Krylov in ClickHouse не тормозит
select * from system.mutations; тоже зависает
источник

DK

Dmitry Krylov in ClickHouse не тормозит
В логах пишут про дедлок:
источник

DK

Dmitry Krylov in ClickHouse не тормозит
2021.03.02 22:31:04.354088 [ 10499 ] {1657479f-761f-463c-a299-f8fcdc92b9c2} <Error> TCPHandler: Code: 473, e.displayText() = DB::Exception: WRITE locking attempt on "default.tt" has timed out! (120000ms) Possible deadlock avoided. Client should retry., Stack trace:

0. DB::IStorage::tryLockTimed(std::__1::shared_ptr<DB::RWLockImpl> const&, DB::RWLockImpl::Type, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l> > const&) const @ 0xf03a6d5 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
1. DB::IStorage::lockForAlter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l> > const&) @ 0xf03ac92 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
2. DB::InterpreterAlterQuery::execute() @ 0xeb484b7 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
3. ? @ 0xeec1c62 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
4. DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, DB::Context&, bool, DB::QueryProcessingStage::Enum, bool) @ 0xeec05bc in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
5. DB::TCPHandler::runImpl() @ 0xf5baf25 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
6. DB::TCPHandler::run() @ 0xf5caba9 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
7. Poco::Net::TCPServerConnection::start() @ 0x11b6786f in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
8. Poco::Net::TCPServerDispatcher::run() @ 0x11b69281 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
9. Poco::PooledThread::run() @ 0x11ca0329 in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
10. Poco::ThreadImpl::runnableEntry(void*) @ 0x11c9c18a in /home/dima/velvetformula/tmp/clickhouse.21.2.3.15/whole/usr/bin/clickhouse
11. start_thread @ 0x7f9e in /lib64/libpthread-2.32.so
12. clone @ 0xfd0af in /lib64/libc-2.32.so
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Т.е. в ALTER UPDATE ... нельзя SELECT той же таблицы использовать?
источник

DT

Dmitry Titov in ClickHouse не тормозит
Dmitry Krylov
Т.е. в ALTER UPDATE ... нельзя SELECT той же таблицы использовать?
Да, там вообще ограниченный синтаксис,
для всяких сложных условий обычно лучше создать отдельную таблицу и словарь на базе этой таблицы и делать dictHas()
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Ок, ладно. Это я всё пытаюсь рекурсию на предыдущее значение сделать...
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Dmitry Krylov
Подскажите, как можно использовать предыдущие значения из строк для вычисления текущего значения?

Например, есть табличка:

x
---
3
8
5
12

Я хочу получить колонку y, которая равна y[-1]*2 + x (или 1, если x = 3).

То есть вот такое:

x   y
--- ---
3   1
8   10  -- т.е. 1*2 + 8
5   25   -- т.е. 10*2 + 5
12  62 -- 25*2 + 12

Хотелось бы как-то так: SELECT x, if(x = 3, 1, neighbor(y, -1) * 2 + x) as y FROM tbl, но там же y ещё не определён.
@unamedrus может, подскажете по этому вопросу?
источник

В

Виктор in ClickHouse не тормозит
Dmitry Titov
Ну тут либо шашечки, либо ехать
смысл aggregating merge tree  в том, что бы агрегировать и уменьшать кол-во строк в разы и ускорять сканирование таблицы. Если вам интересны только почасовые агрегации то делаете в MV toStartOfHour(ts) as ts и храните почасовые.
Сделал MV ReplicatedAggregatingMT + Distributed
При селекте из Distributed получаю ошибку:

DB::Exception: Stack size too large. Stack address: 0x7f12c0ad4000, frame address: 0x7f12c0ed1f10, stack size: 4202736, maximum stack size: 8388608.
источник

DT

Dmitry Titov in ClickHouse не тормозит
Dmitry Krylov
А как мне в agg_state передавать *2 ?
> SELECT x, if(x = 3, 1, neighbor(y, -1) * 2 + x) as y FROM tbl

А оно точно так не работает?
источник

DT

Dmitry Titov in ClickHouse не тормозит
Виктор
Сделал MV ReplicatedAggregatingMT + Distributed
При селекте из Distributed получаю ошибку:

DB::Exception: Stack size too large. Stack address: 0x7f12c0ad4000, frame address: 0x7f12c0ed1f10, stack size: 4202736, maximum stack size: 8388608.
Это бага какая то, пишите на гитхаб.
И покажите таблицы
источник

DT

Dmitry Titov in ClickHouse не тормозит
Dmitry Titov
> SELECT x, if(x = 3, 1, neighbor(y, -1) * 2 + x) as y FROM tbl

А оно точно так не работает?
Вообще в 21.3 уже добавили начальную поддержку оконок, можно попробовать на них сделать.
https://clickhouse.tech/docs/en/sql-reference/window-functions/
источник

В

Виктор in ClickHouse не тормозит
Dmitry Titov
Это бага какая то, пишите на гитхаб.
И покажите таблицы
Переименовал таблицу на которую смотрит дистрибьютед после создания -_ -
источник

DT

Dmitry Titov in ClickHouse не тормозит
Виктор
Переименовал таблицу на которую смотрит дистрибьютед после создания -_ -
Попробуйте это повторить на современной версии кх 21.3 и если повторится то багрепорт все равно нужно писать
источник