- 15 May 2023 (178 messages)
-
О, благодарю!
У меня даже проще получилось:
arrayFilter(
x -> NOT has(t1.array_2, x),
t1.array_1
) AS array_rez
Но проблема в том, что вычитаются сразу все элементы 'a', а не только один, который есть во втором массиве. -
-
Я из клиента и запускаю
При чём csv работает корректно, но я его использовать не могу -
ORC и Arrow тоже самое, только csv json экспортит
-
так не было этого ничего в 2018 году.
клиент обновите до 22.8.17.17
либо используйте curl -
Колдунство какое!! 🙂
Работает, благодарю! -
там просто +1 в левом массиве, -1 в правом, то что = 0 выкидывается, конечно там надо дорабатывать, там отрицательные элементы тоже останутся
-
Ага, немного разобрал и понял задумку, круто!
Спасибо ещё раз -
-
То, что нужно!
Спасибо большое! -
-
-
угу, есть. только divideDecimal на 22.8 не работает....
-
Big Decimal can overflow without exception · Issue #30341 · ClickHouse/ClickHouse
Describe what's wrong It's possible to get meaningless result after big decimal division. Does it reproduce on recent release? Yes. ClickHouse 21.11, 21.8 How to reproduce ClickHouse 21.11 ...
-
зачем вам Decimal128 ?
там скорее всего еще куча проблем, вроде крашится КХ из-за него, но не воспроизводится -
а какой работает без проблем?
-
decimal64
-
маловато.... нам надо хранить 18 до запятой и 18 после....
-
-
-
а с математикой у нее как? :)
-
-
атомы в другую галактику запускаете? понимаю.
-
-
А кликхаус используют для космоса
-
если речь про крипту то нахер не надо decimal там
-
просто храним денежные транзакции в разных валютах. в эфире 10^18 wei, а в 10000 долларе 2 600 000 000 боливаров. так что разброс приличный, + запас в пару разрядов на случай инфляции....
-
-
😂😂😂😂
-
Лучше не хранить значения денежные (тем более крипты) во float. int64 + делитель, относительно удобно и точно получается
-
а математику как с этим подружить? нужно деление и умножение.
-
Только decimal это не float, а fixed point и то, что предлагаете вы - наивная реализация decimal
-
Не увидел контекста про decimal. Почему-то его не использовали, даже не вспомню почему.
-
А можно пример операции? Вернее конкретного действия, что с чем считать нужно
-
Взять одну сумму из транзакции и поделить на другую.
-
Деньги всегда хранят в целых
-
Немного непонятная операция. Из нашего кейса близкое: сумма всех транзакций пользователя: SELECT SUM(amount), divider FROM table GROUP BY divider, далее приводите к единому делителю (divider) и проводите необходимую операцию.
Если речь идет про необходимость перевода крипты в сумму фиата, то мы считали сумму, группировали по делителю (выше) и далее приводили делитель фиата к делителю каждой группы. -
-
если у Вас вот прямо 18 знаков после запятой, то храните всё в UInt умноженным на 10 в 18 степени и делите спокойно одно на другое
-
👍🏻
-
Это работает, соответственно, если мы соглашаемся с тем, что amount / divider равняется абсолютному значению (т. е. 0.03 в нашем представлении будет выражено как amount = 3, divider = 100)
-
По ISO это не так.
-
Вы вводите новый столбец в итоге и изобретаете decimal
-
вот только в Decimal этот столбец задан на уровне схемы, а не отдельной строки
-
Вынужден отметить более очевидно, что вы правы. Но повторно отмечу то, что decimal не был использован по какой-то причине, которую я сейчас не вспомню.
-
Именно поэтому "зачастую" :)
-
Тот подход который вы сейчас описываете у нас уже реализован и несет свои неудобства. Как вариант расматривалась возможность использования Uint и зафиксировтать что у все валют 18 сабюнитов, но это усложняет математику
-
простите, а что становится усложнённого? 😳
-
Всем привет, есть вопрос на счет производительности кликхауса. Он достаточно высокоуровневый, понятно что нужно рассматривать конкретный профиль нагрузки и набор данных, но тем не менее.
Можно ли использовать кликхаус для большого количества клиентских olap запросов? Как ведёт себя кликхаус с увеличением rps?
Если есть что по теме, было бы интересно почитать/послушать. -
конвертация валют становиться запутанной. надо все время помнить что у разных валют разное количество сабюнитов.
-
она не запутанная, а действительно усложненная. Если смотреть на реализацию, то у всего есть свои минусы. Как выше отметили, можно использовать string и забыть про потерю данных, но в то же время забыть про производительность :)
-
я не очень сильно владею вопросом конвертации валют, поэтому ещё раз прошу прощения за возможно дилетантский вопрос.... что такое сабюнит?
если я всё привожу к UInt в том числе и курсы валют, то пока не могу придумать пример, когда бы математика хоть чем-то отличалась от обычной школьной -
типа центы. у японской йоны их нету, а в эфире их 10^18
-
так центы это единица денег, как в россии это копейки, а не рубли
-
На конкретном примере: это когда 70 рублей 40 копеек в нашем представлении будут равны 70400000000000000000
-
Придется ручками прописывать типы например чтобы не переполнится
-
в Decimal это из коробки
-
что не переполниться должно? просто в изначальной постановке вопроса про ошибку в Decimal128 мол нужны 18 и 18 значений порядков... в Uint128 их 39 и никакого переполнения я не придумал пока откуда может взяться...
по сути Uint128 это тот же Decimal128 получается по задаче... ну с небольшим нюансом -
все валюты хранятся в целых минимальной единицы умноженной на нужный порядок десятичного числа... и математика начальной школы, но только с очень длинными цифрами... всё равно в памяти компьютера оно занимает очень длинное место для хранения, так какая разница в каком месте будут нули, а в каком значимые единички?
-
как вы поделите 1 на 8 для decimal (2) ?
там внутри нужен будет decimal (4) , который потом округлится до decimal(2)
Decimal128(19) / Decimal128(19) = переполнение -
поэтому и ввели divideDecimal и multiplyDecimal
-
Это все конечно здорово, кроме того что не работает пока.
Но мне все равно непонятно - зачем складывать яблоки и груши? Или если угодно эфирные копейки и йены? Вы же не храните в соседних строках транзакции на десятки миллиардов долларов и доли центов (долларовых).
Для каждой транзакции хранится тип валюты, кто мешает масштабировать конкретное значение непосредственно в момент конвертации валют для каких-то totals? Откуда это требование на 39 символов? Только что из лени. -
кстати вспомнил что делить можно вот так
select 1/toDecimal128(100,19)* toDecimal128(100,19)
┌─multiply(divide(1, toDecimal128(100, 19)), toDecimal128(100, 19))─┐
│ 1 │
└───────────────────────────────────────────────────────────────────┘
select 1/toDecimal128(100,19)* toDecimal128(3,19)
┌─multiply(divide(1, toDecimal128(100, 19)), toDecimal128(3, 19))─┐
│ 0.03 │
└─────────────────────────────────────────────────────────────────┘
а хотя нет, нифига не помогает -
чудес не бывает, если запрос выполняется 1 сек. и использует 100% CPU, то 100 таких одновременных запросов выполняются >100 сек.
-
Речь скорее про то, что локально запрос может отрабатывать несколько ms, а под нагрузкой время может увеличиться скажем до десятка секунд. Интересно было бы на эту тему что-нибудь почитать про кликхаус, какие есть ограничения.
-
ClickHouse In the Storm. Part 1: Maximum QPS estimation
May 2, 2019ClickHouse is an OLAP database for analytics, so the typical use scenario is processing a relatively small number of requests -- from several per hour to many dozens or even low hundreds per second --affecting huge ranges of data (gigabytes/millions of rows).But how it will behave in other scenarios? Let's try to use a steam-hammer to crack nuts, and check how ClickHouse will deal with thousands of small requests per second. This will help us to understand the range of possible use cases and limitations better.This post has two parts. The first part covers connectivity benchmarks and test setup. The next part covers maximum QPS in scenarios involving actual data.
-
ограничение, что по дефолту <max_concurrent_queries>100</max_concurrent_queries>, но можно поставить сколько угодно.
Чем больше запросов выполняется одновременно, тем больше они мешают друг другу, портя кеши и двигая головы дисков в другую сторону.
Но если >128 CPU core и 1ТB RAM то проблемы нет, можно и max_concurrent_queries = 500 -
> двигая головы дисков
А для ssd это актуальная проблема? -
Спасибо, почитаю
-
в каком-то смысле да.
в любом случае кешей много и можно добится ситуации когда 2 запроса будут одновременно выполнятся 30 сек, а по одному по .01 сек., но это стараться надо вымывая markcache -
Да, потому что с диска читается блоками и при последовательном чтении нужно прочитать меньше блоков. nvme ssd обычно еще быстрее для последовательного чтения чем sata ssd, но это зависит конретно от диска
-
-
в логе КХ при старте.
-
Нету, грепал по max_server_memory_usage
-
2023.05.15 21:39:33.708852 [ 4076534 ] {} <Information> Application: Setting max_server_memory_usage was set to 21.08 GiB (23.43 GiB available * 0.90 max_server_memory_usage_to_ram_ratio)
2023.05.15 21:39:33.708864 [ 4076534 ] {} <Warning> Application: Setting merges_mutations_memory_usage_soft_limit was set to 11.71 GiB (23.43 GiB available * 0.50 merges_mutations_memory_usage_to_ram_ratio) -
Это при дефолтном значении max_server_memory_usage? У меня такая строка при дефолтном, после внесения изменений в конфиг она больше не появлялась
-
значит установилась, фиг знает что там было в 21.11
- 16 May 2023 (177 messages)
-
Доброе утро!
Подскажите, как можно оставить на одной реплике несколько партиций, чтобы на другой реплике при этом партиции были другие?
detach partition, drop partition работают через репликационный поток и не подходят
После сбоя одна из нода начала выкачивать данные с реплики и забивает все ресурсы, хочется сделать, чтобы были данные за последнее время, а потом уже восстановить реплику окончательно -
MergeTree tables settings | ClickHouse Docs
The values of mergetree settings (for all MergeTree tables) can be viewed in the table system.mergetreesettings, they can be overridden in config.xml in the mergetree section, or set in the SETTINGS section of each table.
-
Всем привет! Прошу помощи экспертного сообщества! У нас есть большая Distributed таблица с ивентами - несколько миллиардов записей. В ней есть следующая информация: ts ивента, геохэши, идентификатор пользователя. Partition by event_date, Primary key по event_date, ts и геохэшам. На идентификаторе пользователя (длинная строка) стоит bloom index с гранулярностью 2. Use case у нас такой:
1. Сперва по заданным ts, геохэшам и другим условиям находим ВСЕХ пользователей, удовлетворяющих условиям фильтрации (каждый раз это может быть от нескольких тысяч до миллионов),
2. Затем по найденным пользователям по заданным геохэшам отображаем ВСЕ их ивенты без учета TS
Получается, что подзапрос таблицы самой к себе. С движком Distributed это не работает как надо... Какие есть идеи? -
Global in
-
Благодарю. Для таблицы настройка сразу действует, я правильно понимаю?
-
-
в этом случае падает по памяти на небольшой выборке (на каждой ноде у нас 64Gb)
-
Ну так запрос киньте сюда.
-
```
CREATE TABLE db.event_local(
ts DateTime,
event_date Date,
user_id String,
cnt UInt32,
geo_hash_2 String,
geo_hash_3 String,
geo_hash_4 String,
geo_hash_5 String,
geo_hash_6 String,
geo_hash_7 String,
geo_hash_8 String,
geo_hash_9 String,
... OTHER columns
INDEX uuid_bloom user_id TYPE bloom_filter(0.01) GRANULARITY 2
)
ENGINE = ReplicatedMergeTree('/clickhouse/{installation}/{cluster}/tables/{shard}/db/event_local', '{replica}')
PARTITION BY toYYYYMMDD(event_date)
PRIMARY KEY (event_date, geo_hash_2, ts, geo_hash_3, geo_hash_4, geo_hash_5, geo_hash_6, geo_hash_7, geo_hash_8, geo_hash_9)
ORDER BY (event_date, geo_hash_2, ts, geo_hash_3, geo_hash_4, geo_hash_5, geo_hash_6, geo_hash_7, geo_hash_8, geo_hash_9)
SETTINGS index_granularity = 8192
CREATE TABLE db.event
(
ts DateTime,
event_date Date,
user_id String,
cnt UInt32,
geo_hash_2 String,
geo_hash_3 String,
geo_hash_4 String,
geo_hash_5 String,
geo_hash_6 String,
geo_hash_7 String,
geo_hash_8 String,
geo_hash_9 String,
... OTHER columns
)
ENGINE = Distributed('{cluster}', 'db', 'event_local', rand())
``` -
WITH pre_select AS (
SELECT user_id
FROM db.event AS b
WHERE ((ts >= '2023-03-04 08:00:00') AND (ts <= '2023-04-11 08:00:00')) AND ((event_date >= '2023-03-04') AND (event_date <= '2023-04-11')) AND (geo_hash_2 IN ('w0', 'w2', 'w8', 'w3', 'w9')) AND (geo_hash_3 IN ('w0r', 'w0x', 'w0z', 'w22', 'w23', 'w26', 'w27', 'w2k', 'w2m', 'w2q', 'w2r', 'w28', 'w29', 'w2d', 'w2e', 'w2s', 'w2t', 'w2w', 'w2x', 'w2b', 'w2c', 'w2f', 'w2g', 'w2u', 'w2v', 'w2y', 'w2z', 'w82', 'w83', 'w86', 'w87', 'w8k', 'w88', 'w89', 'w8d', 'w8e', 'w8s', 'w8b', 'w8c', 'w8f', 'w8g', 'w8u', 'w1p', 'w30', 'w31', 'w34', 'w35', 'w3h', 'w3j', 'w3n', 'w3p', 'w90', 'w91', 'w94', 'w95', 'w9h'))
)
SELECT
geo_hash_5,
sum(cnt) AS events_count
FROM dev_igor.bid
WHERE (geo_hash_2 IN ('w0', 'w2', 'w8', 'w3', 'w9')) AND (geo_hash_3 IN ('w0r', 'w0x', 'w0z', 'w22', 'w23', 'w26', 'w27', 'w2k', 'w2m', 'w2q', 'w2r', 'w28', 'w29', 'w2d', 'w2e', 'w2s', 'w2t', 'w2w', 'w2x', 'w2b', 'w2c', 'w2f', 'w2g', 'w2u', 'w2v', 'w2y', 'w2z', 'w82', 'w83', 'w86', 'w87', 'w8k', 'w88', 'w89', 'w8d', 'w8e', 'w8s', 'w8b', 'w8c', 'w8f', 'w8g', 'w8u', 'w1p', 'w30', 'w31', 'w34', 'w35', 'w3h', 'w3j', 'w3n', 'w3p', 'w90', 'w91', 'w94', 'w95', 'w9h')) AND (user_id GLOBAL IN (
SELECT user_id
FROM pre_select
))
GROUP BY 1
Query id: 8de9c63f-921a-425a-af40-52c98f9d5c5b
0 rows in set. Elapsed: 192.714 sec.
Received exception from server (version 23.3.1):
Code: 32. DB::Exception: Received from cluster_name.net:9000. DB::Exception: Attempt to read after eof: while receiving packet from cluster_name:9000: While executing Remote: While processing user_id GLOBAL IN (_subquery2). (ATTEMPT_TO_READ_AFTER_EOF) -
если поставить LIMIT 1 в подзапросе, то такой запрос отработает за 10 секунд, что не подходит под требования к системе
-
WITH pre_select AS (
SELECT user_id
FROM db.event AS AS b
WHERE ((ts >= '2023-03-04 08:00:00') AND (ts <= '2023-04-11 08:00:00')) AND ((event_date >= '2023-03-04') AND (event_date <= '2023-04-11')) AND (geo_hash_2 IN ('w0', 'w2', 'w8', 'w3', 'w9')) AND (geo_hash_3 IN ('w0r', 'w0x', 'w0z', 'w22', 'w23', 'w26', 'w27', 'w2k', 'w2m', 'w2q', 'w2r', 'w28', 'w29', 'w2d', 'w2e', 'w2s', 'w2t', 'w2w', 'w2x', 'w2b', 'w2c', 'w2f', 'w2g', 'w2u', 'w2v', 'w2y', 'w2z', 'w82', 'w83', 'w86', 'w87', 'w8k', 'w88', 'w89', 'w8d', 'w8e', 'w8s', 'w8b', 'w8c', 'w8f', 'w8g', 'w8u', 'w1p', 'w30', 'w31', 'w34', 'w35', 'w3h', 'w3j', 'w3n', 'w3p', 'w90', 'w91', 'w94', 'w95', 'w9h'))
LIMIT 1
)
SELECT
geo_hash_5,
sum(cnt) AS events_count
FROM db.event
WHERE (geo_hash_2 IN ('w0', 'w2', 'w8', 'w3', 'w9')) AND (geo_hash_3 IN ('w0r', 'w0x', 'w0z', 'w22', 'w23', 'w26', 'w27', 'w2k', 'w2m', 'w2q', 'w2r', 'w28', 'w29', 'w2d', 'w2e', 'w2s', 'w2t', 'w2w', 'w2x', 'w2b', 'w2c', 'w2f', 'w2g', 'w2u', 'w2v', 'w2y', 'w2z', 'w82', 'w83', 'w86', 'w87', 'w8k', 'w88', 'w89', 'w8d', 'w8e', 'w8s', 'w8b', 'w8c', 'w8f', 'w8g', 'w8u', 'w1p', 'w30', 'w31', 'w34', 'w35', 'w3h', 'w3j', 'w3n', 'w3p', 'w90', 'w91', 'w94', 'w95', 'w9h')) AND (user_id GLOBAL IN (
SELECT user_id
FROM pre_select
))
GROUP BY 1
Query id: e7b2f194-3896-4901-b25d-f849a6ddb882
┌─geo_hash_5─┬─events_count─┐
│ w281w │ 2 │
│ w0z8k │ 18 │
│ w283f │ 88 │
│ w2833 │ 1 │
│ w2864 │ 71 │
│ w283c │ 174 │
│ w0z87 │ 12 │
│ w2839 │ 1 │
│ w0xxf │ 61 │
│ w281r │ 2 │
│ w0xxg │ 470 │
│ w82n0 │ 28 │
└────────────┴──────────────┘
12 rows in set. Elapsed: 10.766 sec. Processed 13.20 million rows, 1.10 GB (1.23 million rows/s., 102.54 MB/s.) -
Ну для начала я бы поменял order by и event_date вынес в конец.
Во-вторых в pre_select вы получаете весь неуникальный список пользователей и я бы попробовал сделать что-то вроде select user_id, count(1) group by user_id. (Или distinct или uniqExact или groupBitmap надо посмотреть что лучше)
Кроме того, если есть проблемы с памятью и дальше - я бы поставил хинт на разбивку по памяти при группировке -
вы совершенно правы, группировка в подзапросе снижает размерность списка идентификаторов пользователей. Но запрос все равно работает очень медленно - 90сек
-
(
SELECT
user_id,
count(1)
FROM db.event AS b
WHERE ((ts >= '2023-03-04 08:00:00') AND (ts <= '2023-04-11 08:00:00')) AND ((event_date >= '2023-03-04') AND (event_date <= '2023-04-11')) AND (geo_hash_2 IN ('w0', 'w2', 'w8', 'w3', 'w9')) AND (geo_hash_3 IN ('w0r', 'w0x', 'w0z', 'w22', 'w23', 'w26', 'w27', 'w2k', 'w2m', 'w2q', 'w2r', 'w28', 'w29', 'w2d', 'w2e', 'w2s', 'w2t', 'w2w', 'w2x', 'w2b', 'w2c', 'w2f', 'w2g', 'w2u', 'w2v', 'w2y', 'w2z', 'w82', 'w83', 'w86', 'w87', 'w8k', 'w88', 'w89', 'w8d', 'w8e', 'w8s', 'w8b', 'w8c', 'w8f', 'w8g', 'w8u', 'w1p', 'w30', 'w31', 'w34', 'w35', 'w3h', 'w3j', 'w3n', 'w3p', 'w90', 'w91', 'w94', 'w95', 'w9h'))
GROUP BY 1
)
SELECT
geo_hash_5,
sum(cnt) AS events_count
FROM db.event
WHERE (geo_hash_2 IN ('w0', 'w2', 'w8', 'w3', 'w9')) AND (geo_hash_3 IN ('w0r', 'w0x', 'w0z', 'w22', 'w23', 'w26', 'w27', 'w2k', 'w2m', 'w2q', 'w2r', 'w28', 'w29', 'w2d', 'w2e', 'w2s', 'w2t', 'w2w', 'w2x', 'w2b', 'w2c', 'w2f', 'w2g', 'w2u', 'w2v', 'w2y', 'w2z', 'w82', 'w83', 'w86', 'w87', 'w8k', 'w88', 'w89', 'w8d', 'w8e', 'w8s', 'w8b', 'w8c', 'w8f', 'w8g', 'w8u', 'w1p', 'w30', 'w31', 'w34', 'w35', 'w3h', 'w3j', 'w3n', 'w3p', 'w90', 'w91', 'w94', 'w95', 'w9h')) AND (user_id GLOBAL IN (
SELECT user_id
FROM pre_select
))
GROUP BY 1
LIMIT 1
Query id: 2ef44108-29f9-4565-b49b-bc583eceeed7
┌─geo_hash_5─┬─events_count─┐
│ w2qhx │ 2 │
└────────────┴──────────────┘
1 row in set. Elapsed: 89.645 sec. Processed 4.80 billion rows, 389.21 GB (53.54 million rows/s., 4.34 GB/s.) -
Я так понимаю, у вас гео-хэши это разные уровни? Т.е. geo_hash_3 это подуровень geo_hash_2 ?
-
Order by у таблицы надо менять..зачем вам дата первым столбцом, если по ней партиции делаете?
-
Partition pruning вроде как самым первым отрабатывает (если конечно включен вообще в order by)
-
А так.. для подобных запросов делайте ещё одну таблицу - AggregatingMergeTree
-
можно поподробнее?
-
У вас ts используется только при поиске пользователья. Основной запрос вытаскивает агрегаты без ts. Сделайте табличку типа AggregatingMergeTree и собирайте туда sumState в разрезе всех остальных аналитик
-
AggregatingMergeTree | ClickHouse Docs
aggregatingmergetree}
-
День добрый!
Понимаю, что вопрос простой, но не могу решить. На сервере выполнил запрос select * from remoteSecure.... и ошибся в имени удалённого сервера. Теперь постоянно в syste,errors вижу, что эта ошибка увеличивает last_error_message (те запрос постоянно пытается выполниться??). В логах увидел, что ошибка постоянно повторяется. Но ведь я её 1 раз выполнил, исправил на корректный адрес и давно уже забыл. В system.processes не вижу этого запроса. Как и почему повторяется ошибка? -
-
Ребят, всем привет. Подскажите пожалуйста, какое оптимальное время на вставку 10 миллионов записей в клик. У меня выходит около 40 секунд.
-
https://github.com/plmercereau/chat-dbt а это смотрели ?GitHub - plmercereau/chat-dbt: Interact with your database using human queries through OpenAI GPT.
Interact with your database using human queries through OpenAI GPT. - GitHub - plmercereau/chat-dbt: Interact with your database using human queries through OpenAI GPT.
-
нет, посмотрю, спасибо. 40 секунд это много значит?
-
в команде только знакомимся с кликом просто, из-за этого такие вопросы)
-
Интересно, спасибо, посмотрю, что они там наколдовали 🙌
-
На этот вопрос очень сложно ответить. 10 млн записей, это 10 млн интов или 500 колонок. На каком железе работает кх, какая табличка(движок), откуда вставляете, где развернут КХ и клиент
-
Я не вам :)
-
А через что вы вставляете ?
-
через clickhouse_driver на питоне, ch в докере
-
уже понял)
-
Hello everyone
-
-
Всем привет, вопрос по связям между гранулой и и блоком. Если granule скажем 8K, и есть 2 колонки: одна шириной 8 байт, а вторая с huge шириной скажем 64K каждый элемент. Будут ли блоки этих колонок «засихронизированны»? Т.е. одинаковое количество значении в блоках обеих колонок?
-
покажите ошибку, скорее всего ваш ide лишнее генерирует что-то
-
bloom index это конечно здорово, но он не всегда работает хорошо. Я бы сделал отдельные индексные таблицы отсортированные по дате и геохешу (для каждого геохеша своя), а основную таблицу отсортировал по user_id. Чуть больше места и кое-какие проблемы с целостностью данных, зато будет быстро, потому как оба поиска будут идти по нормальному PK.
-
Спасибо за совет! У меня 9 геохешей вот только…
-
А что такого в 9-ти? Не 90 же. Какая разница - отдельная колонка или таблица? Вы же в запросах отдельно к каждому обращаетесь.
Конечно можно их умять и в одну таблицу, но зачем? -
IDE в данном случае стандартный клиент clickhouse, я набираю руками, так что вряд ли речь о чём-то лишнем.
-
-
он ничего и не будет делать, он назначает внеочередной мердж. Смотрите таблицу system.merges.
Ну или используйте optimize_throw_if_noop -
Всем привет! Есть матвью, надо собирать процентаж по некоему полю. Т.е. должно аггрегироваться что-то вида
client_id | status |
_________________________________________________
1 | [["200", 20%], ["400", 78%], ["500", 2%]]
подскажите плиз, как возможно такое реализовать. -
версия clickhouse-client?
-
Всем привет, еще вопрос про материализованные вью. Можно от них добиться такого поведения, что вью будет регулярно пересчитываться по данным в сорс таблице? Задача в том, чтобы в таргет таблице были всегда акутальные данные, а они с течением времени могут протухать.
-
Всем привет, подскажите плиз, что можно сделать с таблицей, удалить не могу, kill query не помогает. Данные там не критичные, разработчик ошибся и повесил такой запрос:
ALTER TABLE develop.kpi_cmt_new_v4_part MOVE PARTITION 20230324 TO TABLE develop.kpi_cmt_new_v4_part; -
Надо также помнить, что ошибки округления набегают немалые. В итоге совсем не очевидно, как и где правильно делать.
В финансах лучше на уровне документа с отнесением ошибок округления на самую жирную (или первую, или..) позицию. А для аналитики лучше на самом высоком уровне агрегации (мб даже на клиенте). -
Нет
-
А live view решит эту проблему?
-
Может кто подсказать? Или только рестарт сервера может помочь?
-
Посмотрите мутации текущие. Если данные некритичные то наверное можно убить мутацию
-
В мутациях нет ничего для этой таблицы, смотрел так:
select * from system.mutations; -
Подскажите, как заставить выполниться запрос
CREATE TABLE xxx
ENGINE = Log AS
SELECT
spider_item_id,
main_spider_id,
description
FROM tmp__0db9167f75
ORDER BY
added ASC,
spider_item_id ASC,
version DESC
поле description - большой текст
сейчас запрос падает по лимитам памяти
Memory limit (total) exceeded: would use 35.62 GiB
Пробовал менять max_bytes_before_external_sort, устанавливал и 1гб и 10, но не увидел изменений.
Без жирного поля description все отрабатывает -
Можете посмотреть?
https://github.com/ClickHouse/ClickHouse/issues/49909 -
а что не так? почему партиция должна быть неактивна? данные ведь не удаляются
-
данные должны удаляться после мерджа, по крайней мере раньше точно так было
-
а если так таблицу создать?
CREATE TABLE qkrq (id Int64, x Int64) Engine = MergeTree PARTITION BY id ORDER BY id SETTINGS merge_tree_clear_old_parts_interval_seconds = 1 -
но там террабайты данных
-
Всем привет!
А кто-нибудь пробовал делать foreign таблицу с полем типа array из ch в postgre? Когда делаю foreign тип array превращается в int, и не получается перенести данные. Чет в гугле ничего не нашла -
Привет,
подскажите, пожалуйста,
баг или фича
с версии ClickHouse 23.3.1.2823
select ifNotFinite(arrayReduce('kurtPop', groupArray(amount)), Null) as kurt_spd_1y
from (
select toDecimal64(78878.47,2) as amount
from numbers(5)
) t
получаю 90071992547409904 -
и по идее, геохэш 9 всегда включает в себя все предыдущие геохэши
-
Всем привет.
Установил clickhouse на удаленную машину через докер, проблема - не получается подключиться через dbeaver.
При запуске clickhouse-server в логах появляются такие ошибки
—
2023.05.16 09:00:18.556471 [ 1 ] {} <Trace> MySQLHandlerFactory: Failed to create SSL context. SSL will be disabled. Error: Poco::Exception. Code: 1000, e.code() = 0, SSL Exception: Configuration error: no certificate file has been specified (version 23.4.2.11 (official build))
2023.05.16 09:00:18.556557 [ 1 ] {} <Trace> MySQLHandlerFactory: Failed to read RSA key pair from server certificate. Error: Code: 139. DB::Exception: Certificate file is not set. (NO_ELEMENTS_IN_CONFIG) (version 23.4.2.11 (official build))
—
В конфиг файле раскомментил строки c listen_host
—
<listen_host>::</listen_host>
<!-- Same for hosts without support for IPv6: -->
<listen_host>0.0.0.0</listen_host>
<!-- Default values - try listen localhost on IPv4 and IPv6. -->
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
—
а в dbeaver получаю ошибку, когда пытаюсь подключиться через пользователя, которого создал командой в clickhouse-client внутри докера 'CREATE USER admin IDENTIFIED WITH plaintext_password BY 'qwerty''
ошибка в dbeaver:
—
В соединении отказано, server ClickHouseNode [uri=http://<host>:8123/default, options={use_server_time_zone=false,use_time_zone=false}]@-1628969032
—
эти options пробовал менять на true, не помогло
При этом через командную строку я могу подключиться
Подскажите, пожалуйста, как и что исправить?
Я совсем чайник если что -
так тоже не работает
-
но issue уже закрыли
-
у меня удалило сразу через секунду, если поставить 60 в этой настройке, удалит через 60
-
а на какой версии ты запускал?
-
22.8
-
Всем привет! Что означает две точки в синтаксисе запросов кликхауса?
пример:
error can't freeze table: code: 497, message: [MASKED]: Not enough privileges. To execute this query it's necessary to have grant
GRANT ALTER FREEZE PARTITION ON db_name..inner.ext_data TO backupper -
да, на 22.8 у меня тоже работало, на 23.3 уже не работает
-
но по умолчания партиция не удалялась, так же как на 23.3, только через время
-
на 23.3 я попробовал с настройкой, она не удаляется через время
-
Hello
-
всем спасибо, название таблицы включало в себя "точку" в начале.
так правильно:
GRANT ALTER FREEZE PARTITION ON db_name.`.inner.ext_data` TO backupper; -
https порт 8443, а не 8123
-
в 22.9 переделали как парты удаляются.
-
если поменять в настройках соединения в dbeaver - не помогло. А docker ps показывает, что clickhouse-server на порту 8123
-
я неправильно прочитал.
docker контейнер надо с ключом -p создавать.
конфиг КХ (listen_host) менять не надо!!!!
https://hub.docker.com/r/clickhouse/clickhouse-server/
networking
You can expose your ClickHouse running in docker by mapping a particular port from inside the container using host ports:
docker run -d -p 18123:8123 -p19000:9000 --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
echo 'SELECT version()' | curl 'http://localhost:18123/' --data-binary @- -
system drop dns cache
-
optimize table <table> FINAL deduplicate
-
матвью такое не может.
не так работают матвью, т.е. оно может преагрегировать данные для этого запроса, но готовый результат в таком виде, не может -
нет такой фичи
-
client_id | status_counts |
_________________________________________________
1 | [["200", 5000], ["400", 100], ["500", 3]]
а так например может? потом можно и поделить на общий count.
Пробую с sumMap, но пока неуспешно -
-
Подскажите, плз, при использовании Normal Views, насколько неоптимальными будут запросы/нагружать базу, в сравнении с ручным запросом?
use-case: хочу сделать Normal View над materialized view. MV схлопывает строки с помощью агрегатных функций, но нередко делает это с задержкой, что приводит к некорректному поведению на клиентах. Поэтому в Normal View добавил лишний group by, чтобы все точно сагрегировалось для клиентов.
Поэтому есть 2 подхода:
- использовать Normal View: select * from normal_view where id = 123
- везде дописать запрос руками select * from materialized_view group by field1 having id = 123
NV удобнее, но ручной запрос выглядит оптимальнее. Так ли это? -
ну в сотни / тысячи раз может быть медленее запрос через view
-
проблема со вью что оно читает лишние колонки и делает еще одну агрегацию, т.е. может быть в сотни раз медленее прямого запроса.
типа есть вью с: select sumMerge() s, browser, date .... group by browser, date
если из такого вью сделать селект: select sum(s) , date .... group by date
оно прочитает лишнюю колонку browser и сделает лишнюю агрегацию group by browser, date и это ужасно медленно. -
Ясно, то есть clickhouse тут не умеет применить какие-то оптимизации под капотом в этом месте. Спасибо!
-
на самом деле это очень сложно. Надо понимать что использованные функции ассоциативны.
-
Хотя вот сейчас попробовал сделать с вложенным запросом (эмулировать NV), запрос занимает 17 мс, вроде и не долго. В таблице MV у меня 250k записей, в перспективе будет не сильно больше. Может в этом случае можно пожертвовать скоростью в угоду удобству?
-
конечно
-
а в каком виде возможно сагрегировать? потом при запосе пересчитаю. Главное чтоб агрегировалось количество по значениям в разрезе группировки. Есть такие агрегаты?
-
болезненная разница будет на больших объемах или, например, если во VIEW у вас перебор с подзапросами и окнами
-
ну откуда я знаю, можете вы или нет.
-
-
Как перенести базу данных с одного сервера на другой, между которыми нет прямой связи? Т.е. нужен перенос через промежуточный файл(ы). Насколько я понимаю у клика нет таких средств как например в postresql типа pg_dump и есть возможность выгружать не всю БД, а только отдельные таблицы через:
clickhouse-client --query="SELECT * FROM source_table FORMAT CSV" > data.csv
или может быть есть что-то более удобное для переноса БД? -
Спасибо большое, оно!!!
-
в новых версиях это починено и после 3 кажется ошибок (dnsresolve), хост выкидывается из кеша автоматически
-
Странно, что вообще не отбилось сразу, я 1 раз запустил, увидел, что неправильный адрес и поправил запрос. А ошибочный целые сутки пытался что-то выполнить.
-
если версии ClickHouse свежие то можно через
BACKUP/ RESTORE
https://clickhouse.com/docs/en/operations/backup#command-summaryBackup and Restore | ClickHouse DocsIn order to effectively mitigate possible human errors, you should carefully prepare a strategy for backing up and restoring your data.
-
спасибо, посмотрю
-
Привет! Может кто подсказать каким образом быстрее всего можно поискать по тексту по типу like '%abc%', сейчас делаю match(coulmn, '^abc|def$'), есть ли какие-то способы быстрее?
-
Спасибо, но если построчно с группировкой по статусам тоже - то это слишком тяжелая мв уже будет (
-
если известно . что искомый паттерн встречается в малом кол-ве data parts
то еще можно skip index ngram_bf1 попробовать
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#functions-support
инвертированные индексы есть. но к сожалению работают так себе (память жрут)MergeTree | ClickHouse DocsThe MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engines.
-
Посмотрю, спасибо, но паттерн к сожалению на всех партах :(
-
тогда skip index не помогут придется сканить всю колонку
там скорость сканирование до нескольких гигабайт в секунду не расжатых данных
и используется Intel Vector либа для этого... -
так dnscache в КХ устроен
-
вы с кем вообще разговариваете? С голосами?
matView может собрать суммы в одной строке, есть два способа.
сделайте в https://fiddle.clickhouse.com/ пример с простыми createtable / insert /create matview.
сейчас совершенно непонятен контекст -
Всем привет,
Подскажет кто-нибудь, каким образом возможно (ли?) взять дамп с таблицы с движком AggregatingMergeTree?
Колонки типов ~ AggregateFunction(sum/avg/max, UInt64)
Пока не пойму как это сделать в datagrip/dbeaver.
Понимаю, что нужно использовать sumMerge(col) для селекта,
-State для вставки. -
Ну так используйте clickhouse-client, он сможет наверное выгрузить ... в каком нибудь native формате
-
https://fiddle.clickhouse.com/72178777-b005-40ea-b0c8-0909a7a825e1
есть колонка status, ее нужно тоже агрегировать в матвью т.е. массив или map статусов с их количеством, в разрезе client_id и session_id соответственно -
Как найти запросы, который съели больше всего тредов? Такой вариант корректен?
SELECT query_start_time,query_id,length(thread_ids) as threads_cnt from system.query_log where query_start_time > '2023-05-16 15:50:00' and query_start_time < '2023-05-16 17:20:00' ORDER BY threads_cnt DESC LIMIT 10; -
В целом ок, но кол-во тредов != потраченное cpu время
-
У нас именно трешолд срабатывает на число тредов, ищем причину. ЦПУ пока не интересует
-
SELECT query_start_time,query_id,arrayUniq(thread_ids) as threads_cnt from system.query_log where query_start_time > '2023-05-16 15:50:00' and query_start_time < '2023-05-16 17:20:00' ORDER BY threads_cnt DESC LIMIT 10;
Точнее будет -
А вообще, кх поддерживает некий пулл тредов которые потом использует для запросов
-
И кх при старте пытается задрать ulimit для кол-ва тредов
-
функция finalizeAggregation
-
сколько статусов может быть в одной session_id максимум?
нужно только req_count ? или все метрики? -
Теоретически по каждой сессии могут быть все возможные (от 1** до 5**), это http коды ответов. Пока только req_counts по ним нужны..
-
А финальный результат можно снова вставить в таблицу с агрегациями? Задача думаю в переносе промежуточного состояния агрегаций из таблицы в таблицу
-
Нет, результат finalizeAggregation это просто число, а не стейт
-
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/summingmergetree#nested-structures
https://fiddle.clickhouse.com/f0cb78e0-19e2-4c8e-b2d5-8ef8d1c5a1d5 -
Привет! Подскажите, пожалуйста, если задать пароль для default пользователя. То обязательно прописывать для каждой реплики в секции remote_servers этот пароль или как-то можно задать в одном месте
-
для AggregateFunction(sum/avg/max, UInt64) да
Вообще вам надо понять что такое AggregateFunction и что такое SimpleAggregateFunction
Ну и стейт можно переность как строку или поток байт.
select sumState(166666) x, hex(x);
┌─x─┬─hex(sumState(166666))─┐
│
� │ 0A8B020000000000 │
└───┴───────────────────────┘
select unhex('0A8B020000000000') x, sumMerge(cast(x, 'AggregateFunction(sum, UInt64)')) res;
┌─x─┬────res─┐
│
� │ 166666 │
└───┴────────┘ -
Здравствуйте!
Подскажите пожалуйста, есть в логах такая ошибка:
<Error> MergeFromLogEntryTask: virtual bool DB::ReplicatedMergeMutateTaskBase::executeStep(): Code: 16. DB::Exception: There is no column timestamp.null in table. (NO_SUCH_COLUMN_IN_TABLE), Stack trace (when copying this message, always include the lines below):
Как узнать, какая именно база.таблица? -
не обязательно
можно использовать secret
можно использовать include https://gist.github.com/den-crane/d6e0f1c7849a0bc44c27eab2de51c911CH dictionary source includedGitHub Gist: instantly share code, notes, and snippets.
-
Спасибо
-
расшарьте все сообщение
с timestamp и номером треда и стектрейсом на pastila.nl -
этот баг очень давно исправлен.
select version() -
Привет! Не подскажите, не знакомо кому решение на базе clickhouse для анализа логов nginx? хочется построить что-то вроде упрощенной яндекс-метрики на собственных мощностях, но упираюсь в то что плохо себе представляю как можно удачно задать структуру данных. Пробовал искать в истории но что-то именно про агрегацию и как можно отобразить - ничего толком не нахожу.
-
логи сделать надо просто структурными в json
можно через https://github.com/kobsio/klogs/
можно через https://github.com/metrico/qryn
можно через https://vector.devGitHub - kobsio/klogs: Fast, scalable and reliable logging using Fluent Bit and ClickHouseFast, scalable and reliable logging using Fluent Bit and ClickHouse - GitHub - kobsio/klogs: Fast, scalable and reliable logging using Fluent Bit and ClickHouse
-
а второй способ какой?
-
Link
Plausible is a lightweight and open-source Google Analytics alternative. Your website data is 100% yours and the privacy of your visitors is respected.
-
Знакомо но это не про логи, как и posthog, а больше вроде никто не использует
-
-
vector про логи
-
Ну это про метрики https://github.com/VKCOM/statshouseGitHub - VKCOM/statshouse: StatsHouse is a highly-available, scalable, multi-tenant monitoring system
StatsHouse is a highly-available, scalable, multi-tenant monitoring system - GitHub - VKCOM/statshouse: StatsHouse is a highly-available, scalable, multi-tenant monitoring system
-
я настроил так логи в nginx:
https://privatebin.net/?4338a5c40ccb9e1b#31qpG8dYyf5JcCRrrTLx5qRFGrJtCCMF7JG634yAkgRX
примерно так создал табличку:
https://privatebin.net/?b6eee7ebc446b86b#gzF5zE9F1b4tbtUkrhZS25sd1niWZxsZyXKVvdYinrV
и примерно так настроил vector:
https://privatebin.net/?2624d52f5c8494b8#2BaCoqMSUTkvCgt5oMPvgK2VJzqFdHQa36QqoR1HTbaQEncrypted note on PrivateBinVisit this link to see the note. Giving the URL to anyone allows them to access the note, too.
-
Про пайплайны если я правильно понимаю, любопытно но я скорее больше именно про их отображение и обработку, но спасибо
-
Интересно, спасибо!
-
Очень любопытно, спасибо!
-
потом в графане можно такого понастроить... и всякого другого тоже 🙂
-
на loki похоже 🙂
-
локи - это аггрегатор логов от графаны 🙂 а на скриншоте сама графана 🙂
локи оказался беспомощным тормозом в рамках одного хоста с не быстрыми накопителями и ограниченными ресурсами. clickhouse уделал локи как стоячего 🙂 -
локи имеет дашборд в графане, весьма похожий.
но да, локи оказался какой-то ерундой с неясной областью применения. Вроде бы про логи - но на логах он тупит сурово 🙂 -
-
о класс, спасибо огромное. У меня не суммировалось, да из-за AggregatingMergeTree.
-
нет, не поэтому.
просто замените мои SummingMergeTree на AggregatingMergeTree и все будет работать точно также
во второй MV -
ну и конечно надо использовать нормальные TO таблицы, а не то что сейчас в примере
-
-
у меня было без sum_map, а просто
groupArray(status) AS countsByStatusMap.status,
groupArray(1) AS countsByStatusMap.req_count
и с AggregatingMergeTree оставались негруппированными, а с SummingMergeTree стали ок. -
ну да, nested summing это только SummingMergeTree
-
простите, а TO таблицы, что это?
-
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf -
Спасибо большое.
-
доброе. подскажите. на винду clickhouse как установить? он только для линукса и мака?
-
Через виртуалку , докер или wsl2
-
Если winserver, я бы поднял Linux на hyper-v
-
Ребят, как во время запроса в поле datetime использовать только дату и игнорировать время?
-
-
Wsl норм вариант. Спасибо.
-
ага wsl это на ВЕНДУ
-
Надеюсь не в прод?
-
Учтите, что диск ext4 понадобится под wsl
-
Поздно. Винда улетела🥲
-
Пытаюсь в исходное состояние привести
-
Проще наверное Linux поставить
-
А так под Hyper-V, начиная от Pro версии Windows ставится нормальный Linux.
-
Принял
-
Добрый вечер,
Подскажите, пожалуйста, у меня есть запрос:
select count() from
(
select
name,
code,
array_values
from table
)
который возвращает 129 строк и отрабатывает за 0 секунд.
Если разворачиваю массив через array join,
select count() from
(
select
name,
code,
array_values
from table
)
array join array_values
то получаю 119 тыс строк (то есть условно в каждом массиве по тысяче элементов), и запрос уже отрабатывает 14 секунд.
Это вообще ок по производительности? ) Array join такой тяжелый? Там вроде не миллионные массивы..
По железу точно не скажу, тк доступа нет, но это вроде нормальный сервер )) и мне казалось на таких объемах железо в целом любое ок.
Куда можно посмотреть, чтобы улучшить время?
Спасибо! -
array join очень легкий
возможно это фетч на клиента занимает 14 сек.
проверьте из КХ-клиента вот такое
select count() from
(
select
name,
code,
array_values
from table
)
array join array_values
format Null
format Null -- делает всю работу, но не возвращает результат -
Спасибо большое, завтра проверю и отпишусь!
-
live view делает то что нужно, с определённым интервалом вызывает select и данные протухшие по timestamp легко отфильтровываются
тут два вопроса:
- live view же на диске хранится, не in memory?
- можно написать select не указывая явно названия таблиц? например используя условный wildcard
Предполагается, что вьюхи можно создавать в рантайме. Не хочется переписывать запрос на чтение при добавлении новой вьюхи. -
-
- 17 May 2023 (222 messages)
-
Кстати фильтр where при создании LIVE VIEW не умеет фильтровать по json полю:
CREATE LIVE VIEW lv WITH REFRESH 300 AS
SELECT user_id, 'key_value' AS key FROM table
WHERE json_object.field == 1
GROUP BY (user_id, key);
вьюха создаётся но потом падает селект SELECT * FROM lv; -
Здравствуйте! подскажите плиз есть ли в CH аналог функции json_agg, мне нужно из внешней таблицы (postgres) взять сгруппированные данные в json(массив объектов) чтобы получилось такое
-
-
если нет, то как вариант можно сделать VIEW в pg, но хотелось бы нативными функциями если возможно
-
-
groupArray()
-
там наверное хочется функцию которая сама сделает json из полей и значений
-
точно )
-
Ааа я не перепутал array_agg с json_agg
-
А зачем вам JSON в CH ?
-
Вам вывести надо в json'e ?
-
мы решили CH использовать как быстрое хранилище на сайте, там храним денормализованные данные по товарам, и вот как раз это поле которое мне нужно это список модификаций товаров
-
Вы мне кажется что то перепутали ... CH не может быстрым хранилищем для сайта ...
-
мне тоже так кажется, но на это я не могу повлиять, так решило руководство
-
А сколько планируется QPS ?
-
планируют как обычно миллионы юзеров в сутки )
-
Киньте 1000 селектов в секунду в CH ... И покажите результаты руководству :) Вы под OLTP нагрузку берёте OLAP решение ...
-
)) понял
-
а дозировать запросы можно через max_concurrent_queries? чтобы просто в очереди болтались запросы, но по мемори лимиту не падали
-
Не знаю не занимался
-
всем привет
подскажите плиз в части PROJECTION и Materialized view
инпуты:
- репортнул ишью (MUTATION в контексте Materialize PROJECTION зависает на этапе MERGE PARTS)
- без projections скорость выборки падает ~x40 раз (DDL по PARTITION BY и индексам в рамках стейментов оптимизирован)
один и тот же дата сет и DDL
без проекций
Read 466460102 rows, 32.58 GiB in 9.817406 sec., 47513579.65637766 rows/sec., 3.32 GiB/sec.
с проекциями
Read 62 rows, 250.30 KiB in 0.259682 sec., 238.7535524218082 rows/sec., 963.87 KiB/sec.
Вопросы:
- есть ли WA (воркэраунд) в части проекций чтобы данные партов/партишнов не афектались
- подойдет ли использование Materialized view + AggregatingMergeTree (чтобы не проседать по перфомансу и выполнялось +- также как с проекциями) -
Проекция это по сути и есть Aggregating, только надо будет самим думать из какой таблицы селекты делать. Ну и мутации соответственно вам тоже 2 раза надо будет делать
-
Привет, возможно ли узнать когда определенные партиции-парты были считаны в последний раз? Чтобы понять какие данные используются реже-чаще.
-
получается, есть вероятность, что в мутациях при слиянии MERGE_PARTS тоже будет exception в system.replication_queue если использовать AggregatingMergeTree и MatViews?
или механика слияний в projection другая, раз баг слинковали c похожей issueSELECT queries using a projection raise a `BAD_DATA_PART_NAME` error · Issue #46413 · ClickHouse/ClickHouseDescribe what's wrong We have implemented a projection using the GROUP BY clause. Queries activating the projection have been running without fault for months. But since a few weeks ago, someti...
-
Можно. И не забывайте про потоки - если количество одновременно исполняемых запросов заведомо больше числа потоков исполнения, то распараллеливание - это зло.
Вцелом, конечно, согласен с коллегой: выставлять доступ к CH для неограниченного числа пользователей - полная дичь. Вас не ждёт лёгкая прогулка ;) -
Не, все должно нормально работать. Это немного другое
-
Склонировал кластер из 2 нод, поменял конфигу, но таблицы вся равно пытаются соединиться на старые ip. Подозреваю, что это из-за host в зукипере. Я изменил имена хостов, удалил корень на ЗК, сделал ресторе таблицы, и результат - в место fqdn теперь в ЗК отображается только домен без имени хоста машины. От куда он берет инфу и как это пофиксить?
-
вот такая есть инфа по партам которые не смогли мержануться
-
а из самой файловой системы посмотреть, когда файл был считан не подойдет?
-
File Timestamps - mtime, ctime and atime in Linux - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
-
Ок. попробую materialized views. отпишу потом.
проекцию/и дропну которые ломают MERGE PARTS -
возможно и подойдёт, я сначала подумал может в самом КХ есть какой-нибудь поле. Но, с другой стороны, это наверное дорого писать такую инфу куда-то при каждом чтении.
-
есть еще такая штука, но я ее не тестил https://clickhouse.com/docs/ru/operations/system-tables/part_log?ysclid=lhreuocv8d961914351system.part_log | ClickHouse Docs
system_tables-part-log}
-
https://stackoverflow.com/questions/29164893/postgresql-union-of-several-tables-using-dynamic-names
> What I'd like to do is to get one big table which is the union of all my vl_* tables, with also a column with the name of the original table.
В CH можно как-нибудь этот кейс закрыть? Без явного перечисления всех таблиц через union all. -
Merge Table Engine | ClickHouse Docs
The Merge engine (not to be confused with MergeTree) does not store data itself, but allows reading from any number of other tables simultaneously.
-
да. там много таких ошибок отсвечивает.
везде Code: 233. в system.replication_queue как раз эти MERGE PARTS операции фэйлятся -
коллеги, доброе утро! Делал я тут insert from select, тысяч 400 всего записей. Ну оно мне сказало, что количество партов для инсерта чересчур велико получается, говорит поменяй предел. Ну я поменял. Ну заинсертил. Ну, таблица старая, плохо прикинул тогда и сделал partition by чересчур мелкий, ну такое. Секунд 15 инсертилось, партов было много, trace рисовал аллокейшны на fs, и по копеечке вставлял, и закончилось всё ок.
после этого взял произвольную запись из исходной таблицы и ищу ее там, где она вставилась. И нет ее.
баг или шо это?
паста тут: https://pastebin.com/raw/iZsh5Ldx
на пасте инсерт из соседней бд, где я повторял для контроля, там тайминг другой, принцип тот же. -
какая версия?
-
23.2.4.12 и 22.10.2.11
-
A events_swap2 тоже MergeeTree?
-
больше похоже имеет отношение к операциями с партами, а не лог доступа
-
да. Отличие только в том, что там не low cardinality strings, но данные те же самые
-
выглядит как то что нужно, спасибо
-
-
-
INSERT INTO table (content) VALUES ('{"a": 1, "b": { "c": 2, "d": [1, 2, 3] }}');
SELECT content.a, content.b.c, content.b.d[3] FROM table; -
Всем привет!
Столкнулся с проблемой в парам. вью, что при использовании джоина возникает ошибка Query parameter 'start' was not set (UNKNOWN_QUERY_PARAMETER).
Подскажите, пожалуйста, можно ли как это обойти и нормальное ли это поведение парам. вью?
Искусственный пример:
CREATE OR REPLACE VIEW v_segment AS
WITH
today() - toIntervalDay({start:Int}) AS date_from,
today() - toIntervalDay({end:Int}) AS date_to
SELECT visitID
FROM visits1 v
INNER JOIN
(SELECT
clientID
FROM hits
WHERE 1=1
AND date >= date_from
AND date < date_to) h
ON v.clientID = h.clientID
WHERE 1=1
AND v.date >= date_from
AND v.date < date_to -
Привет. Кто-нибудь тянул данные с MSSQL в кликхаус? Можно ли без костылей через ODBC лить? Или может какие-нибудь ETL решения?
-
гугель показывает это (не реклама :))
-
Благодарю. Возможно, это поможет)
-
подскажите из за чего могут зависать DROP ? kill не помогает
-
DROP..... SYNC
-
-
проекции заработали
откоментил тут что сделалHanging MATERIALIZE projection MUTATION · Issue #49913 · ClickHouse/ClickHouseINPUTS ReplicatedMergeTree table projections (works fine) CH ver 23.1.6.42 system.mutations for MATERIALIZE projection has is_done equals to 0 for unexists parts Unexpected behaviour Hanging MATERI...
-
Всем привет. Не получается установить кликхаус на мак. Дошёл до компилятора, и пишет:
The CMAKE_CXX_COMPILER:
=/Library/Developer/CommandLineTools/usr/bin/clang++
is not a full path and was not found in the PATH.
Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH
При этом в этой папке clang++ есть. И с clang проблем нет. Скрин: http://joxi.ru/eAO49qGUGzwXQr
В этом процессе новичок, иду на ощупь по инструкции. Поможете разобраться?1684324695641 (19 kb) uploaded May 17, 2023 Joximade using Joxi.net
-
Всем привет. Не смог найти нормальный ответ в интернетах по SQL. Спрашиваю тут: select ... union all select ... выдаст обьединение двух выборок. Вопрос, является ли рандомным порядок этих двух пачек между собой (порядок строк внутри каждой пачки - вне вопроса). Возможно всё ещё хуже и КХ разрешено перемешивать строки между пачками
-
по всем стандартам sql, да (рандомно) и да (порядок не гарантирован, так что строки между пачками могут перемешаться)
-
только это не "хуже", это "лучше"
sql-движок не тратит ресурсы на сортировку, если пользователь не запросил ее явно через order by, данные можно в несколько потоков отправлять и т.д. -
а я и не просил сортировку. я хотел просто склеивание
-
-
Секция UNION | ClickHouse Docs
union-clause}
-
Хорошо. А как грамотно упорядочить пачки ?
-
внутри пачек порядок уже проставлен
-
(я нашёл конечно способ, но такое)
-
Элементарно.
select * from (
select '1' as gr1, ....
union all
select '2' ......
)
order by gr1 -
так я и сделал. но тогда теряется порядок который был ВНУТРИ каждой пачки
-
тогда надо делать сортировку по gr1 и потом через запятую повторить сортировку каждой пачки (блако у меня они одинаковые в каждой пачке) но если бы ли бы разные то ой
-
Ну тогда проще на бэке уже склеить эти два запроса, чем мучать тройной сортировкой сервер )
-
у меня бек стримово просто тащит запрос с КХ где КХ генерит джсонный ответ. тоесть бек очень тонкий
-
вангую что-то есть для этого всего в КХ
-
сделаю-ка feature request на GH. вдруг прокатит
-
а чем обеспечивается порядок внутри каждой пачки?
а то может вы читаете без order by и там на самом деле нет никакого порядка, как вам кажется, просто движок несколько раз выдал вам данные в одном порядке, но согласно стандартам sql это абсолютно не значит, что в другой день он не выдаст вам другой порядок внутри пачки -
внутри каждой пачки явно прописан нужный order by
-
меня интересует порядок пачек между собой. нужен тот в котором они описаны в запросе
-
а зачем ставить из исходников? вы хотите писать код на С++? если нет - ставьте из докера https://hub.docker.com/r/clickhouse/clickhouse-server/
-
если поля сортировки разные в "пачках", сделайте row_number() в каждой по этим полям, и используйте эту колонку в -->
-
здесь
-
-
всеравно это лишняя работа по сортировке, которой хотелось бы избежать
-
это баг в kafka
https://github.com/ClickHouse/ClickHouse/issues/15473Kafka can (still) hang during drop · Issue #15473 · ClickHouse/ClickHouse20.6.6.7, on cluster table drop on 10 nodes cluster, table reads 2 topics. log 2020-09-30 2020-09-30 07:20:12 513899 BgSchPool 46901 Trace StorageKafka (kafka_fact_customer_session) Topics/partitio...
-
Короче запилил feature request: https://github.com/ClickHouse/ClickHouse/issues/49957Add options to SQL for strict UION ALL order. · Issue #49957 · ClickHouse/ClickHouse
Suppose we have the query: select ... from A order by XXXX UNION ALL select ... from B order by YYYY In this case, according to SQL standard, all the records (even between two subselects) can be sh...
-
А, спасибо
-
@den_crane думаешь ересь? мне вот прям надо.
-
и этот реквест так же не решит ситуацию, что сортировка внутри пачек сломается
-
не понял почему. и какой ЭТОТ. если фича реквест, а не sql request, то я же и написал что оно не должно ломаться.
-
это бред.
это надо решать на уровне оптимизатора чтобы order by TT, XXX во внешнем запросе не вызывал сортировку -
а при работе с данными часто сортировку стараются избегать, потому что операция дорогая, и отдают все это наведение красоты клиенту
-
ну ок, но там разные сортировки. тоесть XXX и YYY РАЗНЫЕ.
-
тоесть совсем
-
тогда придётся делать хитры общий order by (с ифником по TT)
-
выглядит как адовый костыль
-
Спасибо
-
ну надо тогда расширение синтаксиса SQL делать либо просто стабилизорвать порядок того что выдает union all
-
да. и мне нужна именна эта стабилизация
-
почему не отдать на клиент?
-
только есть проблема что macos clickhouse это обрубок полного КХ
-
Если она нужна только вам, то берите напильник и пилите.
Звучит грубо, но уж как есть.
А если не только вам, то попробуйте обосновать: вдруг куче людей только этого и не хватало для счастья. -
Такой ответ в принципе для любого feature request так что можно было и не писать
-
Всем привет. Подскажите, в каком формате лучше всего хранить бекапы? По размеру, очевидно, Native, однако в случае внештатных ситуаций (повреждение файла и тд) без понятия как Native ручками посмотреть. Пока склоняюсь к CSV, есть советы на этот счет?
-
я тоже думаю что не имеет смысла заводить feature requests, это замусоривает github.
-
толсто
-
кстати опечатки в заголовках и сокращения, (кмк) дико бесят главного, рекомендую исправить
https://github.com/ClickHouse/ClickHouse/issues/49957Add options to SQL for strict UION ALL order. · Issue #49957 · ClickHouse/ClickHouseSuppose we have the query: select ... from A order by XXXX UNION ALL select ... from B order by YYYY In this case, according to SQL standard, all the records (even between two subselects) can be sh...
-
спс, поправил всё что увидел
-
вот кстати я завел FR про fiddle
https://github.com/lodthe/clickhouse-playground/issues/30
проголосуйте, там автор fiddle очень странныйPrettyCompactMonoBlock by default · Issue #30 · lodthe/clickhouse-playgroundit looks much nicer if enabled SET output_format_pretty_grid_charset = 'ASCII', output_format_pretty_color=0; https://fiddle.clickhouse.com/fd308ccc-94d8-4f7a-b1e5-6fd1ddbe8b18
-
каким образом проголосовать?
-
Вот вам стабилизация
https://fiddle.clickhouse.com/e5afc28c-279e-4907-a638-39a5c1fc133e -
я не совсем верно выразился
просто sql основан на понятии set. набор данных. если его явно не сортировать при чтении, результат не сортирован.
операция union / union all берет несколько set и создает новый set.
и новый полученный set обладает такими же свойствами, как и все — если его не сортировать при чтении, результат не сортирован. так что даже если слепить несколько отсортированных set в один и если даже в определенном порядке, то при чтении этого нового set без явного указания сортировки результат тоже может оказаться не сортирован. так что для вашего реквеста надо не только к union новое поведение прикручивать, но и к select -
3 запроса - 1 с сортировкой по возрастанию возрастов, 2 - по убыванию. Итог выводит как положено при любом количестве запросов.
-
Добрый день!
Хочу сделать материализованное представление, но не пойму что делать если в исходную таблицу инсерт одних и тех же данных может быть несколько раз. Часто бывает такое, что данные за один период могут перегружать по разным причинам.
Соответственно во вьюшке после каждого инсерта идёт вставка данных и данные дублируются.
Сталкивался кто?) Поделитесь опытом пожалуйста -
ребут кафки не поможет? CH тяжело ребутнуть ((
-
Итоговая логика проста - вы нумеруете в подзапросах данные после сортировки. Во втором запросе вы добавляете в нумерацию количество строк из 1 подзапроса. В итоге - сортировка по нумерации.
-
а оптимизатор КХ догадается что каждая пачка уже отсортирована чтобы заново не сортировать?
-
вы по ссылке ходили? Там полный эмулятор клика
-
вы просили запрос - вот вам запрос и без всяких issue )
-
Ходил. я не говорил что оно не будет работать. я спросил оптимально ли оно будет работать
-
я ТОЖЕ сделал (попроще, т.к. у меня упрощенный кейс) но мне не нравится это нагромождение ради простой фичи
-
можно оптимальней, если количество строк вынести в константу, тогда не будет на каждую строку запрашивать количество.
-
вы усложняете, потому что "количество строк" из 1 подзапроса тоже надо подсчитать, это в третьем подзапросе делать что ли, чтобы отдать его результат во второй?
-
Code: 620. DB::Exception: Received from localhost:19000. DB::Exception: PostgreSQL replication initialization did not finish successfully. Please check logs for error messages. (QUERY_NOT_ALLOWED)
А кликхаус пока особенно не умеет писать в лог ошибки репликации Postgres? Вроде ничего не находит -
Ну да. 1 раз посчитать.
https://fiddle.clickhouse.com/5df954bd-eaf6-4999-ba47-9fe90b29ebf4 -
один-то один, но вдруг этот query 5 минут считается по сложному условию.
а если мне пять датасетов надо склеить, или 10. получим десять раз по "всего один раз" и куча мусора в коде
вы же сами написали:
select * from (
select '1' as gr1, ....
union all
select '2' ......
)
order by gr1
надо просто каждый датасет пронумеровать, и сортировать order by gr1, row_num -
всем привет.
подскажите, пожалуйста, по проблеме ниже.
пытаюсь сделать бэкап бд с помощью: BACKUP DATABASE database TO Disk ('backups', '/backups/database.zip/')
и получаю ошибку как на скриншоте ниже
просьба подсказать возможно ли как-то обойти эту ошибку? -
Я пробовал. НО к великому удивлению, второй датасет выдает случайные результаты. Если первый дает в нормальной сортировке, то второй - рандомно. Поэтому пришлось городить так. )
-
это как это вы получили рандом?
https://fiddle.clickhouse.com/e0d2b22e-700f-4f29-b4b4-db6f8bcc4202 -
Вспомнил откуда ) у меня в первой вариации было rowNumberInALlBlocks. )
-
Так что да, этот вариант еще быстрее, согласен )
-
так и задумано. Мат.вью это триггер который получает данные из инсерта. Если в исходную таблицу вставили 3 строки, мат вью тоже получает 3 строки. И это не важно что строки одинаковые.
-
нет, не поможет
-
спасибо
-
жаль(( запросы уже 14к секунд висят. а ребут сервера уходит 1-2 часа((
-
апну вопрос, пока актуально
-
КХ рестартует 2 часа?
-
единственное отдаленное подобие это ReplacingMergeTree
-
матвью можно сделать записывающий в реплейсинг/коллапсинг МТ
-
а зачем matview ?
-
да там 8 терабайт забито + куча словарей. (80 CPU, 320 ГБ RAM)
-
покажите select count() from system.parts
-
96743
-
я понял, что таблица с данными не обязательно уникальная может остаться, а нужен только дополнительный уникальный список
-
ну т.е. тупо партов много. Это случайно так или намеренно? Сколько таблиц?
(есть cache metadata, он ускоряет загрузку КХ до секунд, но немного замедляет инсерты) -
гайс, тут есть какие-нибудь подсказки куда стоит копать?
-
бекапы для трусов
-
select count() from system.tables WHERE database NOT IN ('system', '_system', 'information_schema') ;
252
большинство таблиц парт по дате намеренно был сделан -
)))
-
cache metadata это что то из коробки CH ?
-
зачем бекапить dictionary ? это просто xml / sql , там нет данных
-
select count() cnt, table, database from system.parts where active group by table, database order by cnt desc limit 10
какой partition by и сколько партов в первой таблице? -
да, выключен по умолчанию.
если включить то КХ начинает писать метаданные партов в rockdb и при старте просто читает из этой базы и не сканирует парты на диске -
10765
10219
первые две таблицы
у них partition by по своим id -
намеренно? или так получилось?
-
в этих таблицах так получилось
-
Все на скрине написано. "Бекапы для движка СЛОВАРЬ не поддерживается" Почитай про словари в КХ
-
ну я бы исправил
про cache https://zhuanlan.zhihu.com/p/515899510
(ускорится естественно следующий старт, после старта со включенной фичой)ClickHouse MergeTree启动加速--使用篇前言MergeTree Family启动慢问题一直是ClickHouse社区的痛点。在完成对所有MergeTree part的加载之前,clickhouse-server实例无法对外提供服务。而在生产环境中,加载过程动辄持续几十分钟,严重影响clickhouse集…
-
-
> БД в MySQL примонтирована к clickhouse
что значат эти слова? Можно объяснить в терминологии документации? Какой Engine? -
спасибо!
-
CREATE DATABASE IF NOT EXISTS dashboard
ENGINE = MySQL('10.130.0.17:3306', 'dashboard', 'dashboard', '***') -
Можно удалить/создать - это же простая прокси, без хранимых данных. Неприятно конечно что это цельная Database, будут пострадавшие в процессе
-
кмк должно помочь
detach database dashboard;
attach database dashboard; -
а какой лучший способ для резервирования данных в клике? я пробовал через партиции, еще думаю попробовать clickhouse-copier
-
а clickhouse-backup не пробывали ?
-
хотелось бы штатными средствами
-
-
спасибо, помогло. А вообще есть надежда, что изменения сам подтянуться? у меня баз 50+ и вручную их дергать грустновато.
-
ругается на dictionary , мне его исключить получается из бд при бэкапе? backup database db except db_dictionary..
-
нет надежды
-
Башем за 5 минут делается ведь ..
-
так-то да, но хотелось чтоб КХ сам умел.
-
я попробовал в 23.4 все работает.
забекапился dictionary и вся база
cat /backups/test/test/metadata/flows/item_dict.sql
CREATE DICTIONARY flows.item_dict (`id` UInt64, attr String) PRIMARY KEY id SOURCE(CLICKHOUSE(TABLE item_dict_t DB 'flows')) LIFETIME(MIN 0 MAX 0) LAYOUT(HASHED()) -
видимо в моей версии 22.3.3.44 это не работает(
-
22 это очень страрая версия, там бекап только начинался
-
а какие пока есть варианты для 22.3.3.44 версии ?
физическая копия файлов? + снимок системы? -
clickhouse-backup ?
-
да вот штатными средствами хотелось бы
-
так не было.
был alter table freeze -- снепшот таблицы.
clickhouse-backup это штука которая просто умеет немного автоматизации вокруг freeze -
а clickhouse-copier, например?
-
clickhouse-copier тоже не умеет словари. И это такая штука которой чтобы пользоваться надо IQ >150
-
Понял)))
Буду тогда переходить на более свежую версию и пробовать через backup database и тд.
Спасибо! -
Добрый день, можете подсказать, у нас есть много витрин с данными, которые могут меняться каждый час (парсится статистика от партнеров). В кластере у нас 2 реплики, для этих таблиц используем движок ReplicatedMergeTree. Так вот после получения новых данных они пишутся во временную таблицу и потом через REPLACE PARTITION мы подменяем данные из временной таблицы в итоговую таблицу. Когда таких витрин стало много, стали замечать что запись в кластер начала притормаживаться, и запросы могут висеть по 100 секунд. Если зайти в show processlist когда все плохо то там в основном висят запросы с ALTER TABLE по REPLACE PARTITION.
Хочется понять правильный ли это юзкейс для КХ и какие здесь слабые места? ZK на отдельных серверах в кластере из 3-х реплик. Лимитов у него нет, JVM выделено 3Gb heapSize -
По идее у вас не должно быть записи в тот момент, когда из временной таблицы делается replace partition. Это так?
-
Вот в это место и думаю, что возможно все. Там порядка 50 парсеров, в какой момент там все записывается и когда было инициировано перемещение партиции не понятно.
-
это скорее всего фетч на реплику
-
То есть ZK такие наши действия тоже нагружает? Можно ли как то это избежать? Есть более правильный патерн действий с изменяемыми витринами данных?
-
Вы ищите под фонарем. При чем тут вообще зукипер?
смотрите system.replication_queue -
Она тоже возрастает, когда начинают висеть эти запросы. Потом отпускает
-
Основной вопрос в том, как под капотом работает attach partition на реплецируемых таблицах
-
график вообще ни о чем. Нужно содержимое таблицы.
>attach partition на реплицируемых таблицах
завист от того какая таблица реплицируемая, источник или приемник.
если в источнике есть парт, он атачится, если нет, то фетчится.
важно не удалять парты из источника пока не закончился alter.
move например криво реализован, поэтому удаляет парты раньше чем реплика успела их приатачить
но вообще единственно что нормально работает это attach partition from, все остальное replace/move/,, сделаны на отвали. -
Обе реплецируемые и источник и приемник.
-
И мы не понимаем почему торомоза, может он пытается сравнивать парты еще попутно?
-
хм, не воспроизводится?
https://fiddle.clickhouse.com/e8a6f5ad-3f01-41e2-848c-75f0d97e9cf8 -
не воспроизводится(
версия клика 23.1.3.5 и судя по песочнице, дело в версии - тоже отрабатывает ошибка UNKNOWN_QUERY_PARAMETER -
Можешь подсказать пожалуйста на счет ReplicatedReplacingMergeTree может лучше его использовать, в приведенном кейсе по замене партиций? Или он делает тот же attach partition from
-
там with в таких вью не поддерживались
и сервер крашился из-за вью вообще совсем https://github.com/ClickHouse/ClickHouse/issues/47247parameterized view leads to segmentation fault · Issue #47247 · ClickHouse/ClickHouseI upgraded to Clickhouse 23.2.2.20 to use new parameterized views. Under load I began to get segmentation fault error. Here are few stack traces from logs: 2023.03.04 20:57:50.473964 [ 424295 ] {} ...
-
все ответы в system.replication_queue
возможно надо просто увеличить pool
если есть фетчи из-за replace partition, то починить это -
Спасибо! Тогда будем обновляться
-
Тут есть что такое
-
-
pastila.nl
-
select * from system.replication_queue
-
-
а в какой таблице растет ActiveParts ? и сколько их?
select database, table, partition, count() cnt from system.parts
where active
group by database, table, partition
order by desc limit 0 -
-
а какой
partition by ?
по идее до 16 мержей по дефолту может идти у вас -
плохой ;/
более 600 ключей получается, yyyymm (два месяца храним), и два поля -
https://pastila.nl/?01ef4dae/f864fc5d62fd05af4ff33d3c3e765ff4
отсортированы по cnt, макс 16 частей, почти все приходится на эту таблицу -
сделал детач консьюмера, части резко упали
-
-
-
-
мониторьте select * from system.replication_queue
возможно есть merge таски которые ждут фетча с реплики
по идее до 16 мержей может бежать -
ttl_only_drop_parts ?
-
-
ну он не имеет отношения к сессии
system.merge_tree_settings -
попробуйте поставить background_schedule_pool_size=1024
-
спасибо, но странно что обычно он 2-4
-
@den_crane спасибо за system.replication_queue
У нас на одной реплике гора
REPLACE_RANGE,551
DROP_RANGE,552
Как-то их оттуда можно убить? -
phones are also a good option
-
удалять их из зукипера
SELECT replica_path || '/queue/' || node_name FROM system.replication_queue JOIN system.replicas USING (database, table)
WHERE create_time < now() - INTERVAL 1 DAY AND type = REPLACE_RANGE , DROP_RANGE
потом system restart replica таблица -
Чет не соображу как из ZK удалить конкретный queue-0081148716
Путь не нахожу такой в replica_path -
я запрос поправил, там телеграм || съел,
что запрос возвращает? -
-
1083 всего где то записи висят с 27 марта 2023 это жесть наверно.