- 01 November 2022 (221 messages)
-
BTБ продлил акцию и дальше выплачивает по 3ООО pублей за оставленный отзыв о работе банка! Акция действительна только для клиентов BTБ.
Официальный сайт акции - просто нажимайте на этот текст -
привет, как в кликхаусе сделать подобие "отложенной" репликицаии а-ля mysql/postgres? хочется иметь резерв для быстрого доступа на случай какого-нибудь drop table помимо многотерабайтных бэкапов из которых долго вытаскивать данные
в кластере 4 шарда/8 нод, таблицы в основном ReplicatedMergeTree, CH 22.10
смотрел доку, видел clickhouse-copier, но кажется он не умеет догонять только изменённые данные без полного перезалива -
Может вам лучше подкрутить max_table_size_to_drop, если у вас опасения что ктото может дропнуть непустую таблицу?
-
тогда придётся крутить в достаточно мелкое значение, не очень удоно станет, и в общем-то необязательно drop table, это ведь может быть какой-нибудь стрёмный альтер или транкейт
-
Это было оно, спасибо.
нагрузка упала в разы.
Причем я по новостям о клауд решениях прям подозревал что-то подобное - видимо был прав.
Интересно, есть ли еще подобные оптимизации? -
-
клауд тут ни при чем. Скорее проблема в старом линукс ядре или системе виртуализации.
Алексей Миловидов утверждает что pread_threadpool всегда лучше, на любых дисках и любых профилях нагрузки. Все пользователи у которых стало хуже, имеют странные сетапы.
Для S3 используется вообще другой параметр remote_filesystem_read_method -
Реплика, обычно, это отдельный сервер КХ. В КХ мультимастер репликация, все отдают данные всем.
-
> клауд тут ни при чем. Скорее проблема в старом линукс ядре или системе виртуализации.
20.04, большие диски в аппаратном raid5 -
Подскажите пожалуйста с чем может быть связана такая ситуация - прогружаю данные в null -> mv -> table. Вижу что она весит 6.5 кб, count.txt показывает что там 23 строки, захожу в дибивер пусто. Уже перезагружал и пересоздавал таблицы несколько раз
-
Ядро какое?
-
В system.parts что?
Либо смотрите не в ту бд, либо есть row policy -
GNU/Linux 5.4.0-124-generic x86_64
-
А как посмотреть есть ли row policy на таблицу?
-
Show row policies
-
Спасибо)
-
Всем привет, в системной таблице system.replication_queue
Очередь на репликацию не существующих партиций, не пойму откуда берутся эти задачи. Все они не выполняются по причине:
Not executing log entry queue-0000045957 of type DROP_RANGE for part 20220828-18_29_29_1 because another DROP_RANGE or REPLACE_RANGE entry are currently executing. -
На двух репликах TTL этой таблицы 3 дня
-
И если смотерть system.parts то там нет таких старых партиций на обоих серверах.
-
https://kb.altinity.com/altinity-kb-useful-queries/parts-consistency/#compare-the-list-of-parts-in-zookeeper-with-the-list-of-parts-on-disk
https://kb.altinity.com/upgrade/removing-lost-parts/Parts consistencyCheck if there are blocks missing SELECT database, table, partition_id, ranges.1 AS previous_part, ranges.2 AS next_part, ranges.3 AS previous_block_number, ranges.4 AS next_block_number, range(toUInt64(previous_block_number + 1), toUInt64(next_block_number)) AS missing_block_numbers FROM ( WITH arrayPopFront(groupArray(min_block_number) AS min) AS min_adj, arrayPopBack(groupArray(max_block_number) AS max) AS max_adj, arrayFilter((x, y, z) -> (y != (z + 1)), arrayZip(arrayPopBack(groupArray(name) AS name_arr), arrayPopFront(name_arr), max_adj, min_adj), min_adj, max_adj) AS missing_ranges SELECT database, table, partition_id, missing_ranges FROM ( SELECT * FROM system.
-
скорее всего это слишком старое ядро и проблема в этом
-
Август этого года. Нихуа себе старое
-
Спасибо, кажется то что надо. Копаю
-
-
Всем добрый день! Подскажите, может есть возможность как-то ускорить выполнение запросов. Есть таблица ReplacingMergeTree с PARTITION BY toYYYYMM(date) и ORDER BY (сard_id, date), за каждый день около 50млн записей. Нужно делать выборки из основной таблицы за разные периоды + джойнить таблицы для доп фильтрации и полей. Пример в прикрепленном файле. Добавить индекс дополнительный - в ключе сортировки уже есть поля, по которым в основном идет фильтрация. Поиграть с гранулярностью? Может есть нюансы при агрегации?(т.к. добавление агрегационных функций увеличивает время на порядки). Может что-то еще?
-
-
1. ускорить относительного чего?
2. сколько времени выполняется каждая часть запроса по отдельности? какую работает медленно?
3. положите cards_info в словарь -
3 года назад https://www.opennet.ru/opennews/art.shtml?num=51881Релиз ядра Linux 5.4
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.4. Среди наиболее заметных изменений: экспериментальный драйвер exFAT, режим "lockdown" для ограничения доступа пользователя root к ядру, механизм fs-verity для контроля целостности файлов, возможность использования CIFS для корневого раздела, контроллер ввода/вывода iocost, ФС EROFS, модуль dm-clone для репликации внешних устройств, новая ФС virtiofs для экспорта каталогов в гостевые системы, поддержка GPU AMD Navi 12/14, AMD Arcturus, AMD Renoir и Intel Tiger Lake.
-
https://bugs.launchpad.net/ubuntu/+source/linux/5.4.0-124.140
3+ августа этого года -
Там внезапно дальше циферки есть
-
1) без SUM, AVG и прочего выполняется 4 сек. С ними же, около 11 сек
2) Медленно работает как раз таки из основной таблицы
3) Делал так, прироста никакого -
У rhel'овцев наверно вообще волосы на заднице дыбом встали, учитывая 3/4е ядра, если судить только по первым циферкам :)
-
если у card_id всегда одни и те же brand_name, supplier_name и т.п., можно сделать group by card_id, а все остальные колонки из строк 12-15 обернуть в any()
-
Добрый день, господа.
Вопрос такой - у меня есть инстанс с подключенной внутрь бд sqlite3. Я создал юзверя и выдал ему доступы на SELECT
(GRANT SELECT on sqlite_db.* TO clickuser;)
Выполнение запроса ОК, но при выполнения селекта из таблицы, на которую я дал права вылетает ошибка 497:
Code: 497. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: clickuser: Not enough privileges. To execute this query it's necessary to have grant SELECT(id, requestor, until_expired, date_start, announce, limits, object, admins, moderators, monitor, regions, doctors, form, name, analyst, status, owner, formslimit, pc, rr, files) ON SQLite.researches. (ACCESS_DENIED)
Подскажите, пожалуйста, что я сделал не так? Нельзя указать все таблицы?
При этом таблицы из под этого пользователя я вижу. -
да, так можно сделать, но медленно выполняется именно часть с агрегацией (
-
+ я сейчас проверил, если переписать вашего монстра из строчки 22 на countIf(quantity > 0), то агрегация на моих данных сработала в 2 раза быстрее и запрос съел в 25 раз меньше памяти.
проверьте на ваших. -
Вдруг кто-то понимает, как сделать так, чтобы в поле добавлялось значение ближайшего непустого поля (есть цена за 10-03 и 10-05, тогда 10-04 должно получить значение от 10-03), при чем должен учитываться вариант, когда пропусков дней может быть несколько, то есть просто оконку за предущий день взять нельзя. Вот тут надо, чтобы вместо 0 появилась цена https://fiddle.clickhouse.com/d1d84ba2-0a94-4438-8292-a740ef2e94a6
-
то есть такой же group by, но если просто посчитать count() работает значительно быстрее? я не совсем вас понял
-
-
воу, спасибо
-
если просто count() сделать (без всех полей и агрегаций), то выполнение 2сек.
если с полями (строки 12-15), но без агрегации - 4 сек
если со всеми полями и агрегацией - около 11 сек.
С any попробовал, как вы предложили, - результат такой же -
а если без агрегации из строчки 22, сколько?
-
массивы - зло )
https://fiddle.clickhouse.com/a6e11cfe-3f5d-4d8a-8d6c-f47ec36afab3 -
дважды спасибо)
-
быстрее почти на секунду )
-
Подскажите пожалуйста с чем может быть связано что ttl настройка не перетирает данные? Может ли это быть связано с тем что данные вносятся из будущего - т.е. TTL 2122-10-22 + toIntervalDay(7)
-
В таком случае TTL будет сравнивать с текущей датой?
-
Не совсем понятно что значит "настройка не перетирает данные".
TTL - это же по сути дата, при наступлении которой КХ удаляет\перемещает\сжимает данные либо для конкретных записей, либо для парта. -
Всем привет, может кто-то подсказать из-за чего ошибка аутентификации валится, валится она только на запросе где я пытаюсь вытащить что-то из словаря
-
Ну, при такой конструкции TTL 2122-10-22 + toIntervalDay(7) данные будут удалены 2122-10-29?
-
да
-
А если не удаляются в чем может быть проблема? Обязательно ли делать optimize final?
-
Как вариант если включена настройка ttl_only_drop_parts, а парт содержит как записи с наступившей датой, так и с не наступившей, то они так и останутся висеть.
-
в контексте pread_threadpool очень старое
-
Понял спасибо)
-
Всем привет,
подскажите, пожалуйста,
каким образом в клике можно группировать данные по временным интервалам?
Предрекая, я знаю о существовании функций toStartOf...
пример с приведением таймстампа к интервалу:
select
toDateTime(1661893200) as dt1,
toDateTime(1661896800) as dt11,
toStartOfInterval(dt1, INTERVAL 6 hour) as inrvl_dt1,
toStartOfInterval(dt11, INTERVAL 6 hour) as inrvl_dt11
Результат:
┌─────────────────dt1─┬────────────────dt11─┬───────────inrvl_dt1─┬──────────inrvl_dt11─┐
│ 2022-08-31 00:00:00 │ 2022-08-31 01:00:00 │ 2022-08-31 00:00:00 │ 2022-08-31 00:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┴─────────────────────┘
Другой пример:
SELECT
wb_id as id,
data data,
toStartOfInterval(toDateTime(created_at_hour), INTERVAL 6 hour) as ts,
toDateTime(created_at_hour)
FROM
(
SELECT
id,
groupArray(data) as data,
created_at_hour
from table
WHERE wb_id IN (115222090) AND created_at_hour BETWEEN 1661893200 and 1661979600
group by wb_id, created_at_hour
)
group by wb_id, data, created_at_hour
order by wb_id, created_at_hour
Ответ:
id |data |ts |toDateTime(created_at_hour)|
---------+--------+-------------------+---------------------------+
115222090|[299900]|2022-08-31 15:00:00| 2022-08-31 16:00:00|
115222090|[599900]|2022-08-31 15:00:00| 2022-08-31 17:00:00|
115222090|[299900]|2022-08-31 15:00:00| 2022-08-31 18:00:00|
Суть в том, что результат ожидается подобного вида:
```
id |data |ts |
---------+--------+-------------------+
id |[data] |2022-08-31 00:00:00|
id |[data] |2022-08-31 06:00:00|
id |[data] |2022-08-31 12:00:00|
id |[data] |2022-08-31 18:00:00|
id |[data] |2022-09-01 00:00:00| -
Есть ли какие-то предметные вещи в ядре касательно этой штуки которые не бекпортировали в версию трёхмесячной давности?
Ну и, может, тогда в коде переключатель сделать в зависимости от версии ядра, раз такая беда? Потому что как я уже заметил выше, rhelоводы поседеют -
Я буду очень рад если кто-нибудь ответит или укажет направление куда копать
-
Храню в ReplacingMT актуальный статус заявок. Т.к. решённые заявки не нужны, появилась идея чистить эту таблицу при помощи TTL на дату решения (открытым заполнять её условным 2100 годом, при решении ставить текущую дату).
Правильно я понимаю, что в этой схеме вполне вероятны ситуации, когда удаление по TTL будет срабатывать раньше мерджа и в таблице будут оставаться предпоследние версии заявок с датой решения в будущем, а последние ещё не схлопнутые версии записей с наступившей датой решения будут удалены? -
ну вот например в 5.9 и 5.10 pread_threadpool вообще сломано и ничено никуда не бекпортировано.
https://manpages.debian.org/testing/manpages-dev/preadv2.2.en.html#BUGS -
про переключатель это не ко мне. Я бы просто в доку дописал что поддерживается ядро не ниже xxx.
-
проблема в джойнить таблицы
-
так 2122 через 100 лет наступит
-
Из-за этого и спрашиваю при такой конструкции будут данные удалены или нет? По моей логике нет
-
будут удалены через 100 лет
-
от одного джойна я избавился путем внедрения словаря, но с выборкой из with конструкции избавиться никак не получится, т.к. оттуда нужно взять массив айдишников. Может имеет смысл изменить гранулярность? Может это как то повлиять?
Когда писал просьбу о помощи было за период месяц 11.35 sec.| 1,355,453,726 rows.| 140 GB, сейчас, благодаря советам, довел до: 5.60 sec.| 1,300,722,974 rows.| 61 GB. -
arrayCount -> groupArray на самом деле вы хотели countIf(quontity <> 0)
-
изменение гранулярности сделает хуже
-
да, тут уже подсказали про этот момент, уже поправил
-
date >= у вас точно строки фильтрует? У вас date в partition by таблицы?
-
Спасибо)
-
да, PARTITION BY toYYYYMM(date) и ORDER BY (сard_id, date) в основной таблице cards_daily
-
cards_array у вас выполняется несколько раз, сделайте временную таблицу
-
в смысле начинается интервал не с минимальной даты в выборке?
-
я не пойму, почему в первом примере
2022-08-31 01:00:00, 2022-08-31 05:00:00 преобразуется = > 2022-08-31 00:00:00, 2022-08-31 00:00:00
в то время как во втором:
2022-08-31 16:00:00, 2022-08-31 17:00:00 => 2022-08-31 15:00:00, 2022-08-31 15:00:00
каким образом определяется эта граница начала интервала?
я так понимаю, что для моей задачи необходимо комбинировать результат функции toStartOfInterval с некой другой.
может быть сплитить сутки на четыре интервала и уже после работать с ними в отдельности -
а вообще, по использованию памяти порядка 60гб - это норм кейс? Если одновременно несколько подобных запросов будет - насколько сильную тачку надо?
-
и еще вопрос про внутренние настройки clickhouse: я, можно сказать, из коробки развернул, залил данные, а их большое количество. Может есть какие-нибудь рекомендации по изменению настроек, тюнингу? Потому что я смотрю утилизация идет не слабая )
Может консалтинг имеет смысл взять?) -
-
ну это позволит уменьшить кол-во строк/данных на дисках, ускорит запросы, но необязательно
-
спасибо
-
Все равно нужно будет доагрегировать при выборке, но лучше отправлять на один шард
-
потому что там деление нацело используется, для выделения бакетов, т.е. запрос выполняется параллельно во многих тредах и на многих серверах, в момент выполнения начало интервала просто неизвестно.
если хочется поделить на бакеты и чтобы первый бакет начинался с минимальной даты в текущей выборке, надо делать все по другому, например через массивы либо через window functions, но это конечно будет медленнее и возможно посчитать только на инициаторе запроса -
Словарь не может прогрузиться из-за того, что пользователь, который коннектиться к источнику словаря не задан. либо задан некорректно
-
мне кажется, что использование window functions в данном кейсе нерешаемо на больших данных.
что вы имеете в виду под через массивы? группировать каждую выборку? -
я недавно делал пример но не могу найти (не помню то ли в слаке то ли на stackoverlflow)
в общем идея агрегируем до минимально возможной грануляронсти на шардах во внутреннем запросе, например до дня. Далее во внешнем запросе (у нас уже мало строк), делаем произвольные бакеты которые начинаются с минимальной даты -
попробую найти на стаке, интересно)
-
toDate + intDiv(HOUR(timestamp),6) = вот вам и кастомный бакет
поправил -
Всем привет
Мб кто подскажет причину ошибки, первый раз настраиваю clickhouse.
2022.11.01 14:05:56.033745 [ 94 ] {} <Error> StorageKafka (operation_event_queue): [rdk:FAIL] [thrd:ssl://172.17.99.106:9093/bootstrap]: ssl://172.17.99.106:9093/bootstrap: ../contrib/boringssl/ssl/ssl_lib.cc:1162: error:100000e2:SSL routines:OPENSSL_internal:UNINITIALIZED (after 1ms in state CONNECT, 52 identical error(s) suppressed)
2022.11.01 14:05:56.033821 [ 72 ] {} <Error> StorageKafka (operation_event_queue): [rdk:ERROR] [thrd:app]: ClickHouse-clickhouse-1-sandbox-operation_event_queue#consumer-1: ssl://172.17.99.106:9093/bootstrap: ../contrib/boringssl/ssl/ssl_lib.cc:1162: error:100000e2:SSL routines:OPENSSL_internal:UNINITIALIZED (after 1ms in state CONNECT, 52 identical error(s) suppressed)
2022.11.01 14:05:56.083738 [ 72 ] {} <Warning> StorageKafka (operation_event_queue): Can't get assignment. It can be caused by some issue with consumer group (not enough partitions?). Will keep trying.
<kafka>
<debug>all</debug>
<ssl_key_location>/etc/clickhouse-server/ssl/kafka.key</ssl_key_location>
<ssl_certificate_location>/etc/clickhouse-server/ssl/kafka.crt</ssl_certificate_location>
<ssl_ca_location>/etc/clickhouse-server/ssl/kafka_ca.crt</ssl_ca_location>
<ssl_endpoint_identification_algorithm>https</ssl_endpoint_identification_algorithm>
<security_protocol>ssl</security_protocol>
</kafka> -
так не будет работать.
вот например https://fiddle.clickhouse.com/e367f547-1c80-4049-b6d6-3dbc33184cf5
сделайте чтобы недельные бакеты начинались сегодня.
типа
7 2022-11-01
7 2022-11-08
7 2022-11-15
типа https://fiddle.clickhouse.com/cb707784-1cf5-478a-842d-e334dcd50b7a -
Добрый день, правильно понимаю что send_timeout и receive_timeout влияют на то жив/цел TCP connection, а сам запрос на сервере при этом может остаться бежать, даже несмотря на эти таймауты?
-
типа да, есть max_execution_time
и есть большая путаница, send_timeout и receive_timeout есть на сервере, когда сервер подключается к другому серверу и есть на клиенте. Ну и в http все вообще не так. -
круто, это работает, спасибо!
-
-
ключ суммирования ???
там наоборот определяются колонки которые надо суммировать, и лучше их никогда не определять, эту секцию нельзя поменять -
-
мб кто сталкивался с таким?
-
-
взять параметр который указан в ошибке и выставить в нужное значение
-
а что КХ позволяет удалять файлы?
-
-
Имел ввиду таблички.
-
в ошибке все написано, есть два способа чтобы убрать это ограничение
-
Ок, спасибо
-
-
я не говорил, что это метод универсальный )
просто у товарища была проблема с тем, что со toStartOfInterval (6 hours) у него границы интервалов плавают на разных датасетах, я ему показал, как их зафиксировать в его данном случае -
потому что в system.settings там profile settings
а default_replica_path это server level settings
они к сожалению не отображаются через SQL ;( -
т.е. текущий default_replica_path никак не узнать у запущенного инстанса? Пытался дебажить почему оно не тот путь указывает при создании таблицы
-
спасибо, лишний параметр был)
-
grep default_replica_path -r /var/lib/clickhouse/preprocessed_configs/
-
О как можно, оказывается! Спасибо огромное!
-
Коллеги, добрый вечер всем. Ситуация - есть скрипт, который через clickhouse-client загружает данные в КХ из другой БД. В скрипте установлен LOGFILE. Проблема в том, что в случае ошибок КХ в процессе загрузки они не выводятся в этот лог. Подскажите, пожалуйста, кто знает - как сделать так чтобы они там сохранялись?
-
если там нет тогда дефолтное значение из доки
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#default_replica_path
clickhouse/tables/{uuid}/{shard}Server Settings | ClickHouse Docsbuiltindictionariesreload_interval
-
там есть, но обратил внимание что почему-то в preprocessed_configs нет конфигов из config.d
-
они мержатся в два файла в users.xml и config.xml
-
Апну вот этот вопрос.
Может ли для ReplacingMT с TTL удаление по TTL срабатывать для новой записи раньше, чем она смерджится со старой? -
Да, нашел там все параметры и в итоге заработало. Можете подсказать, пожалуйста, почему только часть параметров из default_replica_path
при создании таблицы разворачиваются в значения, а часть нет? из /clickhouse/tables/{shard}/{database}/{table} получилось '/clickhouse/tables/{shard}/test/move6', т.е. шард остался макросом как и replicaServer Settings | ClickHouse Docsbuiltindictionariesreload_interval
-
правильно
может -
посмотрите в system.macros
shard это макрос
задается через
<macros>
https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/#macros
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replication#replicatedmergetree-parametersServer Settings | ClickHouse Docsbuiltindictionariesreload_interval
-
да, там есть, я просто думал что оно должно подставляться при создании а не потом каждый раз
-
ну вообще {database} и {table} и еще {uuid}
кстати правильно сделали что отказались от {uuid}
такие таблицы можно только через ON CLUSTER создавать
чтобы одинаковый был uuid На всех -
Всем привет! Пытаюсь зацепиться через Power Bi к CH, но выдает ошибку при подключении: "ODBC: ERROR [HY000] Certificate validation error: Failed to verify certificate chain: CA not trusted". Пытаюсь подключиться через DNS. Может кто сталкивался с проблемами или знаете, как решить? Вроде импортнул сертификат в MMC, но там написано, что недостаточно информации для проверки сертификата - это ок?
-
Воспользуйтесь ODBC
-
Да, скачал драйвер и создал источник, но предполагаю, что power bi не видит ключ/сертификат. И не могу понять, что можно с этим сделать
-
CA пропишите
https://kb.altinity.com/altinity-kb-integrations/clickhouse-odbc/ -
-
Да,
Старые данные можно пережать ALTER TABLE xxx UPDATE col=col WHERE 1 -
забыл написать, для колонок которые в составе order by
-
Ну тогда только OPTIMIZE TABLE FINAL поможет, или мержи
-
Есть еще TTL RECOMPRESS но у него мало пользователей, хз как он работает
-
но это нормально будет работать до оптимайза? случайно не получу битые данные
-
Нет, у каждого парта-колонки может быть свой кодек сжатия и это нормально
-
Даже тип колонки может быть разным в разных партах на самом деле
-
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-alter-modify-column-is-stuck-the-column-is-inaccessible/
https://kb.altinity.com/altinity-kb-queries-and-syntax/ttl/ttl-recompress-example/ -
-
-
Да
-
Правильно понимаю что через альтер mv не поменять? Там танцы с attach/detach? Без них никак?
-
неправильно
-
Но там modify_query тоже не работает
-
где там? УМВР
есть MV с TO и без TO и поэтому разные стратегии -
MV без TO использовать бессмысленно и надо просто конвертить в MV с TO
-
Пока не УМВР. mv с to
-
Пока дропнул и пересоздал(
-
Но так наверное лучше не делать
-
-
Тут ищу пока
-
-
наш девопс утверждает что ПОСЛЕ ОБНОВЛЕНИЯ клики с 21.5 на 22.8 увеличилась нагрузка на процессоры.
Такое может быть ? -
ядро линукса какое? uname -a ?
-
узнаю
-
Спасибо 🫶
-
5.4.0-113-generic #127-Ubuntu
-
https://github.com/ClickHouse/ClickHouse/issues/42596#issuecomment-1288860266
local_filesystem_read_method=preadDegrading performance queries of type select when updating CH version to 22.8 LTS · Issue #42596 · ClickHouse/ClickHouse(you don't have to strictly follow this form) Describe the situation What exactly works slower than expected? We have a cluster consisting of 6 shards and a Distributed Table on which selec...
-
Это вам
-
ребят сорян а в чем прикол
begin_at < toDate32('2022-09-05') - не работает
begin_at > toDate32('2022-09-05') - работает
begin_at = DateTime64(3, \"Europe/Moscow\") NOT NULL -
мы как-то обновились, у нас все селекты в 3 раза хуже на нагрузке стали )
правда не в этой версии, что у тебя. Так что бывает такое, да 🙁
потом ишью нашли от Леши, что плохой релиз -
спс
-
а какой хороший ?
у меня раньше были иллюзии что все, что LTS , не должно быть плохим по определению -
какая у вас версия клика?
https://fiddle.clickhouse.com/c9f6ed05-314c-4f1a-9578-6cc8249351ba -
чорт... стремный вопрос ( щас
-
print(ch_server_ver >= '22.3.8.39') -> True
-
сделайте select version()
-
22.3.8.39
-
сегодня обсуждали, читайте отсюда https://t.me/clickhouse_ru/296408Denny [Altinity] in ClickHouse не тормозит
https://github.com/ClickHouse/ClickHouse/issues/42596#issuecomment-1288860266 local_filesystem_read_method=pread
-
тоже вроде работает
https://fiddle.clickhouse.com/ccce0814-8bed-4e15-a998-ff59a0b7bba4 -
спрошу иначе
версия 22.8 "считается" подходящей для использования
у нас сейчас 22.8.5.29 -
client.execute("Select toDate(begin_at), count(*) from sessions where begin_at < toDate('2022-09-05') group by toDate(begin_at)")
-
я не думаю что запрос с группировкой может вести себя как то иначе
-
мне диапазон надо задать. а битвин не работает. начал в больше меньше играть и выяснил что меньше тупо не работает
-
да не доделан Date32
вам надо сравнивать с toDateTime64 -
фуф я думал что всё... рехнулся )
-
я так и не смог вопроизвести )
https://fiddle.clickhouse.com/b76fad7f-0a93-48a8-bef6-d0db0c956969
ошибка с between при использовании Date32 где-то тут мелькала уже, там вроде был баг при использовании today()
upd. нет, там просто баг с today, без Date32 ) -
скорее всего нужны order by / partition by c колонкой d
-
там скорее всего число микросекунд DateTime64 сравнивается с кол-вом дней Date32
-
да, похоже на эту проблему
-
да, вы правы, в partition pruning приведение Date к DateTime неправильное https://fiddle.clickhouse.com/0a71a646-2ea1-4e3c-bc2e-fb625d37038c
-
Всем привет.
А есть какая-то организация которая продает кликхаус?
Или что на http://Clickhouse.com ?Fast Open-Source OLAP DBMS - ClickHouseClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
Есть много компаний что продают свои решения облачные и не очень на базе кликхауса
-
Здравствуйте! У меня прсотой вопрос:
optimize_read_in_order не работает в ReplacingMergeTree? -
А clickhouse.com были самые быстрые на регистрацию домена?
Или кто-то из оригинальных авторов основал? -
Это компания, которую выделили из яндекса и дали несколько раундов денег, фактически кор тима разрабов
-
Я не ожидал такой неприятности, у меня сортироваться стал в памяти запрос. Только для MergeTree поддержана оптимизация optimize_read_in_order, правильно я понял?
-
FINAL используете?
-
Попробовал и с ним и без него - всё равно сортирует в памяти. Хотелось бы чтобы с FINAL работало, но хотя бы и без него.
Понимаю как физически реализовано, и что ничего не мешает и слить окончательно и порядок при этом сохранить. Но так же понимаю, что могли не реализвать для ReplacingMergeTree. -
если что сравнение с DТ64 помогло. спасибо!
ждем заплатку ) -
Без FINAL должно работать, с FINAL скорее всего не сделали, да
-
хм, у меня на свежепоставленных debian 5.10.140-1. На части запросов local_filesystem_read_method=pread дает ускорение в 2-3 раза. Советуете подключить репозитории backports и обновиться до, например 5.19.11 ? Никогда с таким не сталкивался ранее...
-
А что за дисковая? HDD? Raid?
-
а есть какая-то дока по local_filesystem_read_method ?
на https://clickhouse.com/docs/ как то совсем не густоWelcome to ClickHouse Docs | ClickHouse DocsClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP). ClickHouse’s performance exceeds all other column-oriented database management systems. It processes billions of rows and tens of gigabytes of data per server per second.
-
Поиск в гитхабе
-
nvme без рейда
-
Я думаю вы неправильно что то пишете. Покажите запрос и order by таблицы
-
всем привет,
такой простой вопрос, но что-то не могу разобраться - как быстро и "правильно" залить много данных в clickhouse?
имеется таблица, partition by toYYYYMM(data_time), имеется 20000 csv файлов с данными, где-то по 4гб, данных в файлах сортированы по дате (глобальная сортировка по всем файлам), т.к. если их читать последовательно, а не рандомно, то все записи в "блоке" чтения относятся к одной партиции.
заливаю так:
INSERT INTO myplant.ts_data_double_raw (device_id, data_item_id, data_time, data_value, kafka_partition, ingestion_time, is_deleted)
SELECT
device_id,
data_item_id,
fromUnixTimestamp64Milli(data_time, 'UTC') AS data_time,
data_value,
0,
toDateTime64('2022-01-01', 3),
0
FROM s3('https://data.s3.us-east-1.amazonaws.com/sorted/ts_data_double/*.csv', 'CSV', 'device_id UInt64, data_item_id UInt64, data_time Int64, data_value Float64')
SETTINGS max_threads = 64, max_insert_threads = 64, max_partitions_per_insert_block = 1000 (вот зачем? если ставлю default 100 - ругается, хотя вход данные сортированы)
c6a.32xlarge, 128 cores. в процессе имею 100% загрузку cpu (что наверное хорошо ведь?)
Льет быстро, но в результате я имею 1384686 партов размером 3-15mb c колич строк 1-5M
как так то? почему льет такими мелкими порциями, т.е. создает такие мелкие парты?
задача быстро залить эти csv и оптимизировать таблицу.
сейчас я имею 1,4M партов и они очень медленно мержатся. как-то можно ускорить мерж? у меня при 128и ядрах заняты всего 8-10, я бы предпочел загрузить все.
версия 22.10.1.1877 -
подскажите а влияет порядок сортировки в таблице на скорость выборки?
-
-
Спасибо!
-
можно попробовать увеличить https://clickhouse.com/docs/en/operations/settings/settings/#settings-max_insert_block_size. Я бы не заливал все таким одиночным селектом, лучше написать скрипт, который выполняет такие инсерт-селекты каждого файла по отдельности и посмотреть как быстро оно будет переваривать файл в рамках одной партиции, заодно и max_partitions_per_insert_block можно не увеличиватьSettings | ClickHouse Docs
allownondeterministicmutations
-
>toYYYYMM(data_time)
>ставлю default 100 - ругается
это значит что данные размазаны по более чем 100 месяцам, т.е. данные за >10 лет?
>1384686 партов размером
вы точно активные парты смотрите? -
да, where active
-
наверное вопрос про max_partitions_per_insert_block сниму, возможно я перепутал с Too many parts . Merges are processing significantly slower than inserts. (TOO_MANY_PARTS)
@Pershin_Artem_spb спасибо, кажется увеличение min_insert_block_size_rows и max_insert_block_size_rows помогает -
-
да, только на уровне таблицы.
зачем вам на колонку? -
-
зачем вам на колонку?
И что вы пытатесь достичь? -
гранулированных настроек сжатия, часть данных нужны оперативно и через неделю можно жать максимально ибо не нужны, часть нужны полгода, но в целом могут понадобитсья позже с нормальной сокростью доступа и надо указать средний уровень сжатия, часть нужны всегда.
Плюс есть ощущение, что для части колонок возможно будет корректироваться выбранный набор кодеков по факту использования -
ttl recompress меняет только default кодек.
максимально жать плохо, мержи потребляют много ресурсов.
ttl recompress сделан не для этого
ничего вы не выйграете из-за recompress
забейте и жмите всегда все zstd1
doubledelta супермедленный, я не рекомендую его использовать, профита нет -
5Gb в LZ4 vs 9Mb DD+LZ4. ЧТото думаю выигрыш от DD будет
-
А в zstd(1) vs lz4, (без кодеков)?
-
что не так в слудующих мыслях?
ставим по дефолту dd+LZ4, со временем (через полгода) понимаем что возможно дд работает медленно и хотим сменить его на просто zstd на старых данных чтобы поиграться (с отчетами например). Как вижу это я - делаем ttl индекс по одной колонке с рекомпрессией условно для данных старше 5 месяцев. И таким образом избавляемся от установки нового кодека на приемные данные, на случай если выигрыша не будет на наших данных. И потом так же меняем у ттл на первоначальный кодек, после отрабатывания удаляем ттк с колонки и живем дальше -
ну нет такой фичи и не планируется
-
ну то что не планируется не говорит о том что надо говорить что у меня такой потребности быть не может
-
-
создайте. Я вот оператор <=> попросил 5 лет назад (во всех базах есть, в КХ нету), до сих пор жду.
-
-
тоже напарывался на многое, часть фиксилось/менялось, поэтому будут оптимистом)
-
none: 5.00 Gb
lz4: 5.01 Gb
zstd(1): 3.33 Gb
dd+lz4: 8 Mb
записей 1.3млрд, Datetime, один месяц -
А что если delta?
-
дельта + lz4?
-
Delta + LZ4HC например.
-
-
Ну и скорость чтения заодно https://kb.altinity.com/altinity-kb-schema-design/codecs/codecs-speed/
- 02 November 2022 (258 messages)
-
delta+lz4 - 29Mb, кстати почемуто в первых тестах дельта себя показала плохо, может и не по дате это делал даже. Неплохая замена dd
-
А что по скорости чтения?
-
Дельта против дд.
-
20ms, но это не имет смысла на max запросе
-
-
Почему же?
-
А, тогда да.
-
А если обернуть в identity?
-
на count(distinct datetime)
delta+lz4:
Elapsed: 8.701 sec. Processed 1.34 billion rows, 5.36 GB (154.10 million rows/s., 616.40 MB/s.)
dd+lz4
Elapsed: 9.600 sec. Processed 1.34 billion rows, 5.36 GB (139.67 million rows/s., 558.67 MB/s.) -
select max(identity(date)) from yoba
-
-
тут заметнее
max(identity(datetime))
delta+lz4:
Elapsed: 0.552 sec. Processed 1.34 billion rows, 5.36 GB (2.43 billion rows/s., 9.71 GB/s.)
dd+lz4
Elapsed: 2.161 sec. Processed 1.34 billion rows, 5.36 GB (620.51 million rows/s., 2.48 GB/s.) -
@den_crane правильная ли методика тестирования?
-
нет конечно)) тестировать в неконтролируемом окружении без средних замеров запросами которые никогда напроде не появятся)
-
Почему неконтролируемое окружение?
-
Я думал мы тут все джентельмены.
-
Судя по всему для дат лучше использовать дельту и не париться. А дд не использовать.
-
потому что проще сразу на проде тестить некоторые вещи)
-
дд немного оверкил, согласен
-
вы путаете ignore с identity, но в этом случае ignore не нужен.
тестить надо с max_threads=1 -
👍Реакции забыли включить в этом канале. Спасибо, иногда забываю про max_threads=1.
-
select max(identity(datetime)) SETTINGS max_threads=1;
delta+lz4:
Elapsed: 2.451 sec. Processed 1.34 billion rows, 5.36 GB (547.12 million rows/s., 2.19 GB/s.)
dd+lz4:
Elapsed: 8.524 sec. Processed 1.34 billion rows, 5.36 GB (157.31 million rows/s., 629.23 MB/s.)
no comp (none):
Elapsed: 2.711 sec. Processed 1.34 billion rows, 5.36 GB (494.66 million rows/s., 1.98 GB/s.)
default (lz4):
Elapsed: 2.904 sec. Processed 1.34 billion rows, 5.36 GB (461.78 million rows/s., 1.85 GB/s.)
по сути тоже самое соотношение получилось -
Я так понимаю идея в том что max_threads=1 стабильнее и меньше зависит от нагрузки на сервер.
-
в любом случае это просто попугаи, которые к реальному использованию будут иметь некое опосредованное отношение
-
Почему?
-
ну я ж например не буду выставлять 1 поток, не буду собирать даты, они нужны для индекса и там по сути хоть чем жми большая часть будет отброшена даже без чтения с диска. так же у меня не будет такого же сетапа, т.к. на ноуте тесты гоняю. Скорее всего версия клика будет другая.
-
Тогда почему бы не убрать кодек и компрессию?)
-
-
место не резиновое
-
Это осень странные цифры.
А если просто delta nocomp, dd nocomp?
Ну не верится что zstd по размеру быть так плох в сравнении с delta or dd...
Разве что у вас прям ровно тютелька в тютельку изменения меж строк. Можете ддл дать свой на все варианты таблиц? И то как вы проверяете размер? (Пастила или создать все в фиддл) -
Добрый день!
Никто не сталкивался с утечкой памяти при использовании kafka engine таблиц в версии 22.8?
При выполнении detach всех таблиц в БД память не возвращается но утечка прекращается.
Также заметил что утечка происходит значительно быстрее в dev окрудении где поток данных в кафку значительно меньше чем в проде. -
Так был же баг с утечкой памяти в Кафка таблицах после 22.3 и его поправили. Попробуйте последнюю 22.8.
-
Не создается managed КХ из консоли YC.
Создается минут 20-30, после чего отвливается. с двумя unknown error:
Create ClickHouse cluster
Error
Error: 2 Unknown error
Сам кластер создается в состоянии Dead. Изменить что-либо в нем уже нельзя:
Кластер не работает и изменить его настройки невозможно.
Заполняю только необходимые поля, по дефолту. 1 шард, b2.nano
В чем может быть проблема? -
Добрый день, господа.
Вопрос такой - у меня есть инстанс с подключенной внутрь бд sqlite3. Я создал юзверя и выдал ему доступы на SELECT
(GRANT SELECT on sqlite_db.* TO clickuser;)
Выполнение запроса ОК, но при выполнения селекта из таблицы, на которую я дал права вылетает ошибка 497:
Code: 497. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: clickuser: Not enough privileges. To execute this query it's necessary to have grant SELECT(id, requestor, until_expired, date_start, announce, limits, object, admins, moderators, monitor, regions, doctors, form, name, analyst, status, owner, formslimit, pc, rr, files) ON SQLite.researches. (ACCESS_DENIED)
Подскажите, пожалуйста, что я сделал не так? Нельзя указать все таблицы?
При этом таблицы из под этого пользователя я вижу. -
Слабо представляю как я в туда залью 60гб данных)
-
данные не надо заливать...
-
а можно как то посмотреть desugared SQL который CH будет исполнять — с distributed tables замененными на локальные и прочее (в присутствии distributed_product_mode настроек)
-
explain syntax ...
-
Там не на что смотреть. Но его видно system.query_log
Там просто будет заменено имя левой дистрибьютид таблицы на имя недистрибьютид -
-
как раз вижу что правая заменяется при distributed_product_mode=local
-
-
и вы меняете только кодеки колонки datetime или всех?
и как вы размер считаете? -
Ну при local да, я думал вы про allow
-
А если просто delta nocomp, dd nocomp? какие цифры
-
меняю только на datetime для экпериментов. Для остальные пробовал, но так играться не с чем т.к. специфика данных дает схлопывание и lz4 дефолтное жмет достаточно. Размер поколоночный стандартным скриптом
select name,
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size,
formatReadableSize(sum(data_compressed_bytes)) AS compressed_size,
toDecimal64(sum(data_compressed_bytes) / sum(data_uncompressed_bytes), 6) AS ratio,
any(compression_codec) AS codec
from system.columns where database = 'default' and table = 'exp_1'
group by name
order by ratio desc
; -
Ошибка: It does not make sense to have codec NONE along with other compression codecs: DoubleDelta, NONE
-
Всем привет! Подскажите пожалуйста есть ли в CH партиции по хешу или по ренджу? Необходимо сделать партицирование по user_id, но пользователей слишком много и надо как то их объединить в группы. Использую engine MergeTree()
-
дык объедини в группы ) По какому признаку - сам придумай. И делай партиции.
А лучше возьми какой то существующй параметр типа даты добавления пользователя или последней активности. В общем что то боле менее адекватное. -
Всем привет, получаю ошибку в DBeaver 22.1.5 и 22.2.3 - Unsupported data type: Bool.
Clickhouse 22.10.2.11 (обновился, думал решит проблему).
Ругается на поле вида: Nullable(Bool).
Может кто сталкивался. (DataGrip отрабатывает без проблем) -
engine = MergeTree PARTITION BY toYYYYMM(game_ts)
ORDER BY (game_ts, intHash32(user_id))
SAMPLE BY intHash32(user_id)
SETTINGS index_granularity = 8192; -
Спасибо!)
-
https://fiddle.clickhouse.com/a5397b8d-b8dc-4f05-8e61-c2e7cbc28426 - подскажите, пожалуйста, как при указании массива в range(21) вместо 21 динамически вписать количество дней между первой датой и последней (точнее кол-во недель*7) - пробовал селекты, но кх ругается
-
Partition by userid%100
Partition by intDiv (userid, 100000) -
БД КХ содержит данные 2-х партнеров. Данные в таблицах имеют одинаковую структуру , и на таблицы настроен row level Security (row policy) - для разграничения прав доступа на уровне строк. И это работает. Существует ли способ настройки RLS на словарях ? Сейчас ключ словаря - это хеш от идентификатора сущности и идентификатора партнера. Это тоже работает - но не секьюрно как-то. Версия 21.10& Спасибо
-
Это ошибка jdbc драйвера, вам в dbevaer надо скачать другой более новый драйвер
-
А если user_id string формата: «24нт4ou99». Есть какой то способ?
-
Partition by cityHash64(userid)%100
-
🙏
-
Это очень медленно будет работать. Задавайте все явно и числами
-
Спасибо попробую, но в поддержке дибивера пишут, что обновили драйвер, и устранили проблемы, идите в кликхаус, круг замкнулся))).
-
Ошибка кх начинается со слова dbexception нету dbexception - проблема в клиенте
-
Да согласен, спасибо.
-
-
Какая ошибка-то? Наверное надо скастить в не nullable тип
-
да, ругается на nullable, его обернуть во что-то?
-
Не понял идею- простите. RLS на таблицах уже работает - и достаточно шустро. Вопрос был про разграничение доступа на записях в словаре. Сейчас на версии 21.10 при >ch$ create row policy pol_dict on my_dict for select using partner_id = 1 to my_user - КХ никак не ругается , но и RLS не работает. Обращение к словарю разрешено только через dictGet
-
Коллеги, а тип Map(key, value) гарантирует сохранение порядка?
-
Всем привет.
Подскажите как добиться чего-то подобного?
with t1 as (
select
number%2 as c1,
number*10 as c2
from numbers (5)
)
select
number as c1,
t1.c2
from numbers(2) as t2
left join t1
using (c1) -
Добрый день! Подскажите, можно как-то получить валидный json без использования replaceAll?
select isValidJSON('{"a": "hello", "b": "axy/\"\u001d9\u001"}'); -
Привет, после обновления с 22.3 до 22.8.8.3 - вылезли такие ошибки от Prometheus INSERT-ов:
[('ExceptionWhileProcessing',
'INSERT INTO prometheus.metrics (date, name, tags, val, ts) VALUES ',
'Code: 48. DB::Exception: Method getDataAt is not supported for Array(String). (NOT_IMPLEMENTED) (version 22.8.8.3 (official build))',
'Insert')]
В какую сторону смотреть? -
create table tab (id Int8, value String, partner_id Int8, partner_hash UInt64 materialized cityHash64(id, partner_id)) engine=...;
insert into tab(id, value, partner_id) values (1, 'val1', 1), (1, 'val2', 2);
create row policy policy on tab for select using partner_id = 1 to user1;
create row policy policy on tab for select using partner_id = 2 to user2;
create dictionary my_dict (partner_hash UInt64, value String)
primary key partner_hash
source(CLICKHOUSE(... TABLE 'tab'))
LAYOUT(SPARSE_HASHED());
> user1 > select dictGet('my_dict', 'value', cityHash64(1, 2)) -- не должен получить результат
> user2 > select dictGet('my_dict', 'value', cityHash64(1, 1)) -- не должен получить результат -
Это понятно что можно солить хэш идентификатора - а соль держать в секрете )) Может быть есть более остроумное решение ?
-
groupArray | ClickHouse Docs
Syntax: groupArray(x) or groupArray(max_size)(x)
-
похоже на это? https://github.com/ClickHouse/ClickHouse/issues/42851`GraphiteMergeTree` behaves differently between `22.3.13` and `22.3.7` · Issue #42851 · ClickHouse/ClickHouse
Describe the issue GraphiteMergeTree behaves differently between 22.3.13 and 22.3.7 This problem was found in cluster, and I suspect that standalone machines will have the same problem How to repro...
-
ну нет, мне нужно воспользоваться join-ом и присоединить все экземпляры из правой таблицы в массив. По факту только одна колонка с массивом добавится.
То чт овы предлагаете - это только через группировку, тогда бы мне нужно было делать группировку по всем колонкам -
dd: 165 MB
delta: 5Gb (как и исходные) -
какая то жесть, не бывает таких идеальных данных когда datetime четвертый по списку =)
-
я что-то не понимаю или это баг кликхауса ? почему order_id повторяется если я хочу просто вытащить первое и последнее значение?
-
final ?
-
?
-
движок какой ?
-
и изменится ли картинка если добавить final
-
а если просто вытащить select order_id order by order_id — не повторяется?
-
движок mergetree final пишет что не поддерживает
-
повторяется
-
Попробуйте сделать в with отбор данных с order by, а потом из результата взять last_value... Возможно, сортировка не применяется.
-
а в чем проблема тогда?
оконная функция != group by агрегация -
final - это вроде как раз про megretree
-
вы попросили подсчитать значение для каждой строки, он и подсчитал
если вам нужно первое и последнее значение per order id -> select order_id, argMin(...), atgMax(...) group by order_id -
я просто ожидал увидеть не такое поведение.
-
-
-
подскажите пожалуйста, можно ли в MATERIALIZED выражении стобца ссылаться на EPHEMERAL столбец. Проблема такая: внешний процесс вставляет строки со временем, которые не разбирает parseDateTime, поэтому просто сделать тип столбца DateTime и использовать неявное преобразование строки во время не получится. parseDateTimeBestEffort разбирает и охота сделать timestamp_string String EPHEMERAL, timestamp DateTime MATERIALIZED parseDateTimeBestEffort(timestamp_string). Это будет работать?
-
это очень сложно понять, простите ) пожалуйста, описывайте проблему ясно, без необходимости поиска отличия между картинками)
вы про то, что у первых двух строк разные значения last_state? -
да
-
это потому что по дефолту применяется ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW в оконке
пропишите там явно ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING -
кто понимает почему Table default.range doesn't exist, когда она прописана в CTE и даже отрабатывается запрос к ней: https://fiddle.clickhouse.com/66f3d3d7-1c8d-46d8-baa2-b9126c9c2630
-
почему
select count() from numbers(100) limit 8
возвращает 100 а не 8? это какаето магия LIMIT? или как то надо агрегировать -
@orantius бан господину выше
-
небось еще и одну строку вместо 8 ?
-
count же возвращает одну строку, хоть limit 1 пиши
-
order by и limit выполняются после select согласно стандартам sql
-
спасибо
-
как последние 5 тогда получить ?
-
-
-
хмм, звучит как план
-
что значит "таблица прописана в cte"?
вы создали cte под именем range, cte живет на уровне запроса, где вы его определили.
другие запросы его не видят. -
Привет. Подскажите пожалуйста как в клик Хаус добавить поле не повторяющихся чисел?
Оконные функции и сте не работают в моей версии))) -
откуда такая информация? у меня запросы всегда видели другие cte и селектили из них, в этом смысл cte во многом, разве нет? даже cte видят друг друга, не говоря об основном запросе
-
это в какой базе данных такое поведение?
-
ch version 22.2.2.1
-
скиньте пример через fiddle.clickhouse.com
-
-
Зачем нужны сte, если их нельзя вставлять в основной запрос?
-
чет с разных впн проверил не работает
-
а если через https
https://fiddle.clickhouse.com/ -
ага, редиректа нет
-
так работает
-
-
-
так разговор не про их использование в "основной части запроса", а про использование в другом запросе, что вы пытаетесь сделать в вашем коде
-
в чем разница?
-
в том, что cte — это именованный подзапрос (живет на уровне запроса), а не временная таблица (живет на уровне сессии или если глобальная в некоторых субд, на уровне всех сессий, что к ней обратились)
-
В sql server, да и в других бд (насколько я встречал) CTE , это всего лишь удобоваримая обёртка для FROM. Грубо говоря кусок из CTE вставляется внутрь from. Если используется несколько CTE, происходит тоже самое. Т е нижестоящее cte видит вышестоящее. Т.е. конструкция
With cte1
As
(Select a from b),
Cte2
As
(Select a*a from cte1)
Select * from cte2
Left join cte1 on (1=1)
работает во всех языках -
подскажите пожалуйста фича с EPHEMERAL для колонок в варианте без указания выражения с какой версии поддержана?
-
"from a left join b" и "from b right join a" должны же дать эквивалентные результаты? или есть какие то подводные камни?
-
-
в КХ нет в общем случае
если a и b distributed то не должны -
Добавлю также, что в SQL сервер cte не работает толком в силу работы оптимизатора - результаты подзапросов не используют индексы при джойнах. В CH все наоборот.
-
а есть где то в доке про это?
-
в моем случае "a" это подзапрос в котором есть выборка из distributed
-
да
-
где-то есть
-
вот так подправил https://fiddle.clickhouse.com/d9293a03-e6b8-4839-8e6a-c86599a9d2e5
-
ну вот не нашел ничего кроме кейса с distributed X distributed (что в принципе понятно)
-
а зачем вам right join ? потребление памяти вы не измените таким образом
-
кардинальность правой таблицы меньше, идея была что CH из нее hash table построит сначала
-
-
1) создать и заполнить таблицу распределенную
2) создать dictionary on cluster
3) сделать system reload dictionary on cluster , чтобы он заполнился на всех нодах -
cte просто заново выполняется каждый раз, но обращаться к нему можно
-
ок, это плюс минус тоже.
хотелось бы чего попроще как с темп таблицами которые сами при запросе кидаются во все ноды с инициатора -
-
флажок для чего?
-
нет, так КХ не обмануть
-
я создаю Replicated таблицу опуская макрос shard, таким образом таблица получается с 1м шардом и n реплками
-
получилось, но я так и не понял почему нельзя все, что в cast, вынести в cte в данном конкретном случае
-
в каком данном? о чем вы?
-
https://fiddle.clickhouse.com/ce2c6940-bfe3-4faf-9cc4-32e7d25b6515
вы знаете что есть 2 with? один для констант, другой для CTE -
неожиданно заработало))
-
чтобы при joine словаря, инициатор рассылал его по другим шардам как он это делает с темп таблицей
-
такого функционала нет, мне кажется, получите ошибку что словаря нет на ноде, на которой его нет
-
это замечательно но это часть последовательной логики программы, получается надо удостоверится что все отреплицировалось прежде чем продолжать...
-
может проще переписать запрос чтобы джойн был на инициаторе?
-
там не совсем джоин, там поиск в гео словаре... и много данных, хочется на шарде
-
можно и без репликации - словарь может смотреть на конкретную ноду, там же можно явно хост задать в источнике , вместо localhost
-
-
ну это то как сейчас задумано
https://t.me/clickhouse_ru/296902【D】【J】 in ClickHouse не тормозиткакой лучший способ заполнения словаря на кластере для использования в distributed запросе? CREATE table ON CLUSTER FILL any node CREATE DICTIONARY SOURCE cluster() ? или можно че то проще?
-
вот в чем было дело)))
-
/stat@combot
-
-
-
если OOM-killer системы решит убить его, то может. Смотрите логи dmesg - там будет написано , если это произошло
-
-
-
Коллеги, добрый день! У меня нубский вопрос, но я замучилась гуглить без результата( хочу поставить скрипт на выполнение в cron. В скрипте команда на создание таблицы
Пишу такое
* * * * * clickhouse-client -u [username] --password [password] [dbname] /etc/create.sql >> /var/log/cronlog.log 2>&1
В cronlog.log написано "Code 36. DB Exception: Positional options are not supported. (Bad arguments)
В query_log базы пусто. Что не нравится клиенту в этом случае? -
Вы хотите запрос из файла выполнить?
Я делала так:
cat file.sql | clickhouse-client -h host -u user > outputfile -
Спасибо! Сейчас попробую как у вас сделать
-
можно внутри сессии сделать \i file.sql
-
а чего там идеального, данные с датчиков раз в секунду с высокой стабильностью. Расширение до мс думаю эту красивую картинку разрушат)
-
Может кто поделиться конфигом haproxy для балансировки clickhouse по безопасному tcp соединению?
-
Да, вчера ночью уже забыл попробовать вариант:
- order by перечислением, а не туплом
- без final
так оптимизация работает, другие 3 варианта - нет, в том числе c final не работает никак
Запрос лень обфусцировать, как есть не хочу публиковать. -
@den_crane Добрый вечер
Подскажите, пожалуйста. Получаю ошибку при конекте через haproxy
Code: 210. DB::NetException: SSL connection unexpectedly closed (127.0.0.1:9440)
haproxy настроен на балансировку по безопасному tcp протоколу
при настройке на 9000 такой проблемы нет -
а без haproxy , прямо на 127.0.0.1:9440 работает? Может у вас клиент не понимает что ssl надо делать?
-
прямо, без хапрокси все ок
-
не знаю, гуглите сами HAProxy with SSL passthrough
-
Спасибо
-
-
Всем привет! Не могу к пустой таблице присоединить парт - получаю 233 BAD_DATA_PART_NAME. Парт точно есть, имя из detached_parts получаю. Версия клика 22.8.4, а данные с 21.11.5. Могла ли повлиять смена синтаксиса создания таблицы с ENGINE = MergeTree(date,(sid, uid),8192) на ENGINE = MergeTree()
PARTITION BY date
PRIMARY KEY (sid, uid)
SETTINGS index_granularity=8192
? -
>Могла ли повлиять смена синтаксиса
конечно, парты не совместимы, там в партах разная структура и разный способ именования
только insert select -
DB::Exception: This syntax for *MergeTree engine is deprecated. Use extended storage definition syntax with ORDER BY/PRIMARY KEY clause.See also allow_deprecated_syntax_for_merge_tree setting. (BAD_ARGUMENTS) (version 22.8.4.7 (official build)) А эта опция allow_deprecated_syntax_for_merge_tree может помочь?
-
да, она для этого и сделана
-
просто инфы по ней не нашел, куда ее прописывать. В config.xml в <merge_tree>?
-
странная у вас задача. КХ не средство редактирования json
-
вам разово?
set allow_deprecated_syntax_for_merge_tree=1 -
Какая есть :(
-
нет сделать-то можно, просто это странный вопрос.
Зачем это надо-то? (в смысле может есть проще вариант) -
Цель - убрать те данные, которые нельзя видеть пользователю, согласно нормам компании, они хранятся в определённых ключах json, поэтому я пытаюсь его распарсить:)
-
Спасибо! Пересоздал таблицу и парты присоединились.
-
-
Спасибо!!!!!
-
привет
Проблема. По метрике DiskSpaceReservedForMerge вижу что место выело под мердж в 800гб. При этом мерджей нет. версия клики 22.8.4.7
Пробовал делать рестарт клика, детачить-атачить таблицу. Резерв уходит при детаче. Потом снова появляется
Проблема появилась после kill mutation на этой таблице
Подскажите как можно освободить место от этих мерджей?
мутация была по удалению данных. Но пришлось прервать из-за недостатка места -
-
-
-
детачет партиций не было. проверял. Шадоу проверю.
мутации не работают т.к. не хавтает места для резерва.
Пока решение — это детач партиций поштучно. потом детач-атач таблицы — тогда резерв уменьшается. Хочу довести до кол-ва свободного места и дождаться будет ли мердж... -
-
-
От диска свободным должно оставаться хотя бы 20% на случай маневра (чтобы было время для решения вопроса заканчивающегося места)
Абсолютный минимум свободного места: 100% от самой жирной партиции (select max(total_bytes_on_disk) from (select partition, sum(bytes_on_disk) as total_bytes_on_disk from system.parts group by partition) as t) -
-
Немного лучше
-
-
как подсказать CH использовать больше cpu для мержей? увеличил background_pool_size до 64, никакого эффекта, максимум 16 ядер используется (всего на машине 128). других активностей нет, хотел бы хотябы половину ядер загрузить, т.к. после загрузки данных получилось очень много партов, 160k (ключ партиционирования выбран правильно, просто данных много). остальный настройки дефолтные, версия 22.10
-
нет, нету никакого дерева.
Просто КХ пытается делать как можно меньше мержей и при этом чтобы кол-во партов в партиции было не очень большим, там хитрая формула с кучей параметров, с экспонентами и учетом загрузки пула мержей. Т.е. если вы постоянно вставляете в таблицу A то она мержится, при этом в таблице B мержей не будет если вы туда не делаете инсертов, хотя там скажем 50 партов в партиции. И зачем-то мержер планирует в мерж парты примерно одинакового размера, зачем?, никто уже не знает, и при этом парты должны мержится в строгом порядке, чтобы не ломать логику replacing, collapsing. -
-
чтобы поскорее все смержило на большой машине, а после сделать backup/restore на слабую, типа прод, машину. пытался изначально грузить сразу на prod, так у меня почти неделю оно данные заливало. кажется быстрее поднять большую машину в ec2, все быстро загрузить/оптимизировать и после через s3 сделать restore
-
-
уже сделал, но все равно больше 16и ядер не использует
-
-
Посмотрите настройку max_replicated_merges_in_queue
-
таблица не replicated
-
-
-
-
-
-
МЕГА АКЦИЯ В🍀 GREEN ROOM RBOT
📱Закончился МЕФ? Нету дудки? Хочешь ЭКСТАЗИ или LSD? Негде намутить STUF? Конченые шопы, , недостаток товара ?
🌎О нас знает вся Н@РКО индустрия, и ты - точно не исключение.
УСЛОВИЯ АКЦИИ
Прямо сейчас стартует АКЦИЯ, с 22:00 до 7:00 утра.
В течении этого времени каждый кто пополнить кошелёк бота на суму от:
❤️🔥(2000-4000₽) Получает на аккаунт бонусную 1000 рублей.
❤️🔥(4000-6000₽) Получает на аккаунт бонусные 2500 рублей.
❤️🔥(6000-10000₽) Получает на аккаунт бонусные 4500 рублей.
💎ЗАЙДИ И УБЕДИСЬ В ЭТОМ САМ! Не тупи , просто зайди и посмотри какие мы топовые!!!!
✅Моментальная выдача!
✅100% наход !
✅Поддержка 24/7!
✅Перезаклады моментальные!
✅Нет комиссий!
✅Удобный топовый бот!
✅Легкое и моментальное пополнение!
✅Лучшее качество!
🍀 GREEN — Каманда №1 🍀
🍀 GREEN — Каманда №1 🍀
🍀 GREEN — Каманда №1 🍀 -
-
Хай, а есть кто rust использует для работы с базой? Загрузку стрима нужно переписать, сейчас у меня на aws buckets льётся.
-
Попробовал пятью способами подключиться, пишет “connection reset by peer” при любых таймаутах. Может ли это быть из-за того, что я на trial периоде пытаюсь взаимодействовать?
-
-
Можут глупый вопрос, но как эффективно объединить внесколько таблиц в одну с общим ключем сортировки эффективно. в каждой таблице свой набор атрибутов. Через union муторно как то получается)
-
Clickhouse-backup
-
Клауд?
Ну потыкайте их саппорт, в целом должно работать -
Merge table engine, но ключ сортировки у каждой таблицы будет свой
-
А там уже сделали pruning фильтров, если под капотом view? Вроде такая проблема была
-
А при таком объявлении
ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate)
и фильтре только по counterid клика поймет что не нужно лезть в каждую партицию? Или будет проверять каждую? -
Ну, кмк pushdown должен работать, но он дюже хрупкий, так что не всегда и это еще не исправили)
-
В 21 версиях вроде не работал(
-
explain indexes = 1 вам в помощь
https://clickhouse.com/docs/en/sql-reference/statements/explain/EXPLAIN Statement | ClickHouse DocsShows the execution plan of a statement.
-
А как трактовать
"Condition":true
? -
Условие истино
-
2+2=4 истино, 2+2=5 ложно
-
я догадывался, но тем не менее
-
-
[думаю, что] так как фильтра по ключу партиционирования нет, то партиции фильтруются как where true, то есть берутся все, остается 92 из 92 партов.
потом берется фильтр по primary key, и оставляет только 273 гранулы между метками, их движок и сканит -
т.е. при таком выводе клика лезет в каждую партицию ?
-
Клауд
-
нет, он просто понимает, что по ключу партиции он отфильтровать ничего не может, о чем и сообщает
а "лезет" он в метки primary key в оперативке. -
но PK , он ведь как бы отдельно внутри каждой партиции (парта)?и если фильтра по партициям нет , то проверяется каждая ?
-
CounterID у вас в первой позиции, так что кх по PRIMARY KEY может понять максимальное и минимальное значение CounterID для каждого парта, и если ваше значение находится за пределами данных границ, кх не будет читать данный парт.
-
ну правильно, но партиций у меня 90 шт (партов считай еще больше) и клика проверит каждый парт ?
-
я не говорю что она будет его вычитывать, но проверить на мин/макс должна ?
-
думаю, что если "чтение меток primary индекса" входит в ваше понятие "проверяется", то да
если вы имеете в виду полный скан парта, то необязательно. -
Да,
Причем в некоторых случаях анализ индекса может занимать значительное время от всего времени запроса, поэтому есть некоторые хаки
https://kb.altinity.com/altinity-kb-queries-and-syntax/multiple-date-column-in-partition-key/Multiple aligned date columns in PARTITION BY expressionHow to put multiple correlated date-like columns in partition key without generating a lot of partitions in case not exact match between them.
-
спс
-
можно немного пояснить ?
-
в приведенном примере поля как бы не являются частью ключа, но присутствуют в нем ? ято то типа indexes with included columns в mssql ?
-
😱Барыга перестал отвечать на звонки?
👍GREEN ROOM Всегда онлайн
МЕГА АКЦИЯ В🍀 GREEN ROOM RBOT
УСЛОВИЯ АКЦИИ
Прямо сейчас стартует АКЦИЯ, с 22:00 до 7:00 утра.
В течении этого времени каждый кто пополнить кошелёк бота на суму от
🔥2000₽ получает бонус 1000 ₽.
-У нас только наход
-Только лучшее качество
-Лучшие цены
-Моментальная круглосуточная поддержка
-Огромный выбор товара
-Мы лучшие на рынке
🍀 GREEN 🍀
🍀 GREEN 🍀
🍀 GREEN 🍀 -
-
Не совсем.
В приведенном примере:
у нас есть два набора колонок в PARTITION BY
1. выражение от которых задает партицию: date
2. значения которых кх используют для создания minmax индекса: date, created_at, inserted_at -
т.е. эта конструкция ignore(created_at, inserted_at) задает min/max для каждого из полей created_at, inserted_at в пределах партиции ?
-
Она упоминает данные колонки в PARTITION BY выражении, а следовательно кх посчитает для них minmax индекс (не путать с minmax skip index) для них.
ignore же нужно, что бы для всегда вернуть 0, что бы значения в данных колонках не влияли на ключ партиционирования -
Хак короче
-
это ж не только дат касается?
-
Нет, но minmax индекс обычно имеет смысл только для инкрементальных значений. (числа, даты, время)
-
это понятно
- 03 November 2022 (195 messages)
-
Подскажите, как массив UInt32 преобразовать в массив строк?
-
Или есть ли аналог multiMatchAny для массива UInt32?
-
Получите 3OOO pyб. от BTБ! Необходимо просто оставить отзыв и деньги у Вас на балансе.
Актуально только клиентам BTБ, сайт акции - ссылка -
has, вроде, подошëл
-
Акция от BTБ банка все ещё действует, каждый клиент получит выплату 7ООО рублей за пройденный опрос на официальном сайте.
Официальный сайт акции (нажимайте на текст) -
Всем привет! Ставлю скрипт на расчет через Airflow. У меня падает запрос по памяти, решил считать в цикле по партициям с обращением к каждой отдельной партиции. Может у кого нибудь есть пример такого расчета? Или подскажете как правильнее сделать?
p.s. ограничение по дате сделать нельзя, тк партиции по хешу от uid -
Привет Всем. Хочу удалить но мне выдает ошибку DB::Exception: WRITE locking attempt on "system.query_thread_log" has timed out! (120000ms) Possible deadlock avoided. Client should retry.
-
Where hash(uid)=hash('xxx') и так перебираете все свои уиды.
Но интуитивно кажется что у вас уже проблемы раз парты по уидам. -
это сколько у вас партиций-то?
-
около 60, таблица несколько раз обращается к самой себе по user_id, по этому самым оптимальным решением на мой взгляд было партицировать по user_id, и считать по партиции с группой пользователей
-
понятно
обычно делают календарные партиции, а user_id, как низкокардинальное значение можно было просто на первую позицию sorting key поставить -
Возможно в этом тоже проблема, не хотите показать структуру данных и запрос? Вдруг найдётся более оптимальное решение задачи, а не последствий проектирования?
-
Всем приввет
Types of column 1 in section IN don't match: FixedString(512) on the left, String on the right.
То есть мне fixedString напдо к стринге приводить в обязательном подяке чтобы сджойнить?
а чего так жостко то? ) -
ну можете стрингу привести к fixedString
-
моч то могу но не очень понятно зачем строку к строке приводить
-
потому что это не строка к строке
-
надеюсь станет понятнее:
SELECT
toFixedString('hello', 10) AS f_string,
length(f_string) AS f_s_len,
'hello' AS n_string,
length(n_string) AS n_s_len
┌─f_string─┬─f_s_len─┬─n_string─┬─n_s_len─┐
│ hello │ 10 │ hello │ 5 │
└──────────┴─────────┴──────────┴─────────┘ -
День добрый!
Возникла проблема на длительном запросе к ClickHouse.
Буду очень признателем любым советам)
Имею следующее окружение: приложение на .net6, ClickHouse 22.7.2.15, JDBC Bridge. Запускаю все отдельными docker-контейнерами через docker compose.
Проблема:
При отравке долгих запросов из приложения .net на CREATE TABLE AS SELECT from JDBC получаю зависшее соединение на стороне .net.
Снимал tcpdump с контейнеров с CH и .net и видел такую картину: запрос на стороне ClickHouse исполняется без ошибок и таблица создается, но контейнер с CH получает RST пакет от контейнера .net, НО tcpdump, снятый на контейнере с .net не фиксирует этот RST пакет. Т.е. как будто, он создается в docker сети, но кем?
Вся проблема в том, что я устанавливаю на стороне приложения длительный тайм-аут на запрос, поэтому для меня это критично, т.е. httpClient на стороне .net тупо ждет, пока не проойдет тайм-аут и только тогда разорвет соединение.
Сами контейнеры общаются между собой напрямую, никакого прокси нет.
Понимаю, что это скорее проблема не CH, а моего окружения, но не думаю, что только только я столкнулся с подобной проблемой при работе CH и .net в docker-сети)
Что я пробовал:
- настраивать iptables как тут: https://imbstack.com/2020/05/03/debugging-docker-connection-resets.html
- настраивать сеть docker как Unmanaged (как тут: https://github.com/moby/moby/issues/40217#issuecomment-708276691)
Ни один вариант не помогDebugging Docker Connection Reset by Peerimbstack does things with computers.
-
по размерности понятно
но когдам ысравниваем слова МИР и Труд то они тоже имеют разную размерность ) -
и под капотом (если я не ошибаюсь) так же являются char[]
-
я не очень понимаю к чему эта дискуссия, считаете, что текущая реализация ошибочна - можно завести issue или даже сделать PR который позволит сравнивать без преобразования типов
-
-
Добрый день! Подскажите пожалуйста, с чем может быть связана ошибка:
Code: 1001, type: pqxx::broken_connection, e.what() = Lost connection to the database server. (version 21.11.4.14 (official build))?
Ранее запросы на несколько джоинов работали нормально, сейчас начали выдавать эту ошибку. Если писать запрос на одну таблицу, то ошибки нет.
Подключение идет через ENGINE = PostgreSQL -
Привет.
Правда что CREATE TABLE AS SELECT не атомарный, и что если во время SELECT произойдет ошибка, то может остаться пустая таблица (или с неполными данными)? -
-
камней много)
правильно ли вы подключились к кафке, совпадают ли типы?
Сделайте мв которая отлавливает ошибки и сможете увидеть -
CREATE TABLE IF NOT EXISTS default.kafka ("startLTime" UInt64, "changes" String)
ENGINE = MergeTree()
ORDER BY "startLTime";
CREATE TABLE default.queue_test ("startLTime" UInt64, "changes" String)
ENGINE = Kafka('kafka-host:9092','system', 'hd', 'JSONEachRow') settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1;
CREATE MATERIALIZED VIEW default.test_view TO default.kafka AS
SELECT *
FROM default.queue_test;
SELECT count() FROM default.test_view; -
а как ее сделать? было бы отлично увидеть какие ошибки возникают
-
<yandex>
<kafka>
<security_protocol>...</security_protocol>
<sasl_mechanism>...</sasl_mechanism>
<sasl_username>...</sasl_username>
<sasl_password>...</sasl_password>
<debug>all</debug>
tail -f /var/log/clickhouse/server.log -
-
А этот конфиг можно настроить на чтение двух разных кафок?
Например одна тестовая, другая прод, со своими сертификатами/юзерами -
Нет, насколько знаю. Но не могу утверждать это уверенно
-
Правда
-
как найти записи в таблице, которых нет в другой таблице, что-то вроде:
SELECT * FROM TABLE_1 T1 WHERE NOT EXISTS (SELECT * FROM TABLE_2 T2 WHERE T2.ID = T1.ID)
пробую так:
SELECT T1.ID FROM TABLE_1 T1 LEFT OUTER JOIN TABLE_2 T2 ON T2.ID = T1.ID WHERE T2.ID IS NULL
не работает... -
select t1.id from t1 where t1.id not in (select t2.id from t2)?
-
exists через "*" ???
-
ну первое не будет работать, в кх не работает проброс во внутрь полей
в во втором в чем проблема? -
хм. попробовал, не работает. данные точно различаются.
-
Есть таблица:
CREATE TABLE perfstats
(
`TimeReceived` DateTime,
`sw_guid` LowCardinality(String),
`lid` UInt32,
`connected_lid` UInt32,
`PortXmitData` UInt64,
`PortRcvData` UInt64
)
ENGINE = MergeTree
PARTITION BY toStartOfDay(TimeReceived)
ORDER BY TimeReceived
Каждая запись уникальна по трём полям: sw_guid, lid и connected_lid. Ну и TimeReceived, понятно.
PortXmitData и PortXmitData - счётчики, они с каждым следующим опросом инкрементируются (иногда переполняются, ну да ладно)
TimeReceived инкрементируется по три минуты, но не ровно три минуты, +/- несколько секунд
Мне нужно высчитать rate отдельно по каждому значению. То есть вычесть предыдущее значение PortXmitData от текущего и разделить результат на разницу в секундах между двумя опросами.
runningDifference хорош, но непонятно, как его привязать к уникальности по трём полям.
Помогите, пожалуйста, голову уже сломал -
вот и мне интересно )
-
читается так: найди все id в таблице t1, которых нет в таблице t2
-
оконные функции?
-
да. но не ищет. ни через OUTER JOIN ни через NOT IN
-
да, over partition by пробовал, что-то результат не сходится, если руками считать. соседние строки берёт
-
значит у вас нет такого, или что-то недоговариваете
-
то есть понятно, что руки кривые, но непонятно, где
-
any(PortXmitData) OVER (PARTITION BY sw_guid, lid, connected_lid ORDER BY PortXmitData ASC ROWS
BETWEEN 1 PRECEDING AND 1 FOLLOWING)
вроде такое найдет предыдущей значение PortXmitData -
вообще можете тут почитать
https://altinity.com/blog/clickhouse-window-functions-current-state-of-the-artClickHouse Window Functions -- Current State of the ArtWindow functions are available in ClickHouse! Learn about this long-awaited feature and how it works, based on extensive QA work at Altinity.
-
все разобрался )
-
Понятно, что чудо СУБД могла сама как нить организовываться и привести одно к другому. Но подобного добра в Click навалом. Например на if оба результата тоже должны быть приведены, и decimal с int-ом не прокатят. А вот операция сравнения между ними - вполне. С ключами джойнов такая же беда. С другой стороны вкатить команду приведения не долго и совсем не в напряг, по факту времени на подобную отладку не шибко много уходит. Хотя обезьяний труд немного.
-
изначально в КХ была суперстрикт типизация, т.е. надо было писать x = toUInt64(1) и это было прекрасно, жаль что это убрали
-
Жень я без наездов за отсуствие автоприведения. просто хотел выяснить может есть в этом какой то великий замысел.
-
left outer join не продюсит null если не установлен параметр join_use_nulls
-
Полагаю влом такую мелочь дописывать. Хотя код ведь открыт в Гите и вероятно можно и самому заплатки раскачать....
-
вообще 40 лет назад предполгалось что в бд будут домены и кол-во яблок нельзя будет сравнивать с весом носков, жаль что нигде этого нет
-
По-настоящему жосткая СУБД вообще бы разрешала такую операцию только для целых чисел ;)
-
замысел в том что типы без преобразования сравниваются быстрее. Вызов кастинга добавляет работы, поэтому строгая типизация вынуждает вас делать нормальные одинаковые типы,
я гарантирую что FixedString(512) -- это выстрел в ногу, ошибка, там должен быть String -
а зачем тогда фиксед стринг если это выстрел в ногу? у меня там реально строго фиксированное значение.
получается в топку это Fixed ? переделываем на строки и не парим мозги? -
всегда всегда 512 ? рили?
Почему тогда в другой таблице String ? -
я как-то замерял, и FixedString(512) по перформансу ничем не отличается от String, разница заметна до FixedString(10)
-
Да есть и ошибки, к примеру в одной таблице код склада uint16, а в следующих уже uint32 вкачал для унификации с кодом товара. И джойнить подобные вещи всегда нужно через приведение. Ну а как быть с приведением констант типа toDecimal(0,3)? Здесь то явно замысла нету.
-
зуб даю да. в другой таблице просто не досмотрел )
-
ну я бы исправил uint16 на unint32
>Ну а как быть с приведением констант типа toDecimal(0,3)? Здесь то явно замысла нету.
что? я не понял -
-
В конструкции
if(kol > 2, toDecimal32(0,3), kol)
Если kol decimal с тремя знаками после запятой то и ноль привести туда же придётся -
А исправить уже в бэклоге уж год отвисает, все руки не дойдут...
-
-
да, изначально было можно для каждого топика задать свой конфиг через <kafka_topicname>
сейчас появился более удобный путь named_collections https://github.com/ClickHouse/ClickHouse/issues/28703#issuecomment-1241852550How can I provide specific settings for kafka topic with dots in name? · Issue #28703 · ClickHouse/ClickHouseI tried provide sass configuration for topic with name like 'team.topic', but unsuccessfully I also tried replace dot with underscore. broker,cgrp <auto_offset_reset>e...
-
вообще нормального варианта нету, я всегда делаю на клиенте
-
это не доделано
-
-
подскажите а тут тоже какая то приколюха с приведением?
toTimeZone(begin_date,'Europe/Moscow') > toDateTime64('2022-09-01 00:00:00.000', 3)
begin_date - DateTime64(3) там лежит время в UTC (хотя странно, я думал что при инсерте timstamp приведется к +3) -
Не работает условие по приведенной к нужной тамзоне дате
-
или не toDateTime64 еще обернуть в toTimeZone надо?
-
-
toTimezone делает не то что вы думаете
Она меняет не время, а метаданные колонки, что бы рендерить в строку -
Нет такой фичи
-
Добрый день! Из Метрики массив прилетает как [‘sdfsdf’,’sdfsdfsd’] и в одном из значений есть апостроф в значении, есть настройка для учета такого, чтобы insert не ломался?
-
-
надо регулярку придумать, которая не будет трогать окружающие апострафы ….
-
Нет, почему? У вас как вставляются данные?
-
requests.post(host, data=content, params=query_dict, verify=SSL_VERIFY)
где
query_dict = {
'query': 'INSERT INTO ' + table + ' FORMAT TabSeparatedWithNames ' -
-
да
-
-
ну я так и сказал регулярку писать ))) но вдруг есть настройка )
-
все же верится что КХ должен уметь такое переваривать
-
не очень понятно каким образом? Искусственный интелект применять?
-
))) согласен был не прав.
но кажется дважды, ибо в чистом виде апостраф экранирован Harry\'s -
скорее всего у вас питон слеш съедает
-
да-да, найду и накажу ))
-
-
-
-
Просто как гипотеза. возможно у вас всегда задваивается вставка, только на одном шарде insert_deduplicate=0 а на другом insert_deduplicate=1.
Посмотрите квери лог на предмет количества инсертов -
Инсерт всегда 1
-
-
-
Дедупликация не включена в кластере
-
Ребят а как правильно изобразить
select COLUMNS('data') APPLY( countIf(data > 0)) ?
Если sum то работает олично. суммирует значение в ячейке для каждой колонки. А мне надо тупо +1 если не ноль в колонке. -
Хз как диагностировать) Проблема есть если вставлять через кх клиент?
-
jdbc драйвер для клика используется
-
-
Ну сначала проверить есть ли проблема с теми же данными через кх клиент
-
-
APPLY(x -> countIf(x >0))
-
у меня 50 колонок начинающихся со слов data
в этом весь прикол ) -
Так а оно же для каждой колонки сделает apply и правильно посчитает
-
спасибо огромное! выручил очень )
-
Подскажите пожалуйста как в CH можно оптимизировать многократное использование повторяющегося подзапроса?
Я 6 раз использую …where id in (select distinct id)…
Например в Oracle можно было сделать with(+ materialized) -
Можно попробовать запихать его в скаляр, скаляры кешируются
-
Это как? Я просто в CH совсем новичок
-
WITH (SELECT groupUniqArray(id) FROM ...) as arr
SELECT * FROM WHERE id IN (SELECT arrayJoin(arr)) -
Спасибо)
-
-
named collections
-
Спасибо большое
-
Вопрос про бэкапы, возможно так и должно быть, но выглядит странно
выполнил BACKUP TABLE TO S3('...') данные на s3 записало, но .backup файл не появился, хотя прошло уже два часа с момента как в логе появилось "Finalizing backup S3('...')"
это нормально? можно как-то посмотреть, оно живое или где-то умерло на этапе записи метаданных? бэкапе 273945 файлов на s3 получилось. в логе ничего больше про backup нет, ошибок нет
в system.backups
id: 08d7757b-4185-4e93-88f8-674c296e8211
name: S3('...')
status: CREATING_BACKUP
num_files: 0
uncompressed_size: 0
compressed_size: 0
error:
start_time: 2022-11-03 06:05:40
end_time: 1970-01-01 00:00:00
куда посмотреть живое оно или нет? -
-
named collections
-
спасибо 🙏
но задавать параметры можно только через xml ?
мне бы как-то через SQL - на yandex.cloud ClickHouse -
Только xml.
Можете попробовать потыкать поддержку облака, вдруг зальют ваш XML, но хз. -
Можете еще сделать VIEW в другой БД и натравить ваш словарь уже на это VIEW
-
понял, спасибо
-
-
-
отвечу сам себе. прошло еще 3 часа, .backup файл появился. зато теперь restore на другию машину восстанавливается аж со скорость 3mbit/sec
-
Добрый, как опитимзировать запрос with. Несколько позапросов забивают всю оперативку в процессе просчетов. Я уже раздробил на несколько стедж таблиц, но все равно не хватает. Делил по справочнику. Т.е. у меня 10000 позиций я поделил по 1000 и все равно не хватает.
-
На всех кусках
Memory limit (total) exceeded: would use 65.77 GiB (attempt to allocate chunk of 8589836288 bytes), maximum: 56.54 GiB. (MEMORY_LIMIT_EXCEEDED) (version 22.4.5.9 (official build)) -
Добрый вечер! Если массив с датами прилетает в таком виде с этим можно что-то сделать при вставке
[\'2022-09-14 23:48:48\',\'2022-09-14 23:51:15\'] -
или только реплейс?
-
Коллллеги, просветите или дайте что то почитать.
Есть у меня в некот. таблицах секция SAMPLE BY
примерно такого видаENGINE = ReplacingMergeTree(Changed)
PARTITION BY toYYYYMM(toDate(DayDate - 25567))
PRIMARY KEY Id
ORDER BY (Id,
DayDate)
SAMPLE BY Id
SETTINGS index_granularity = 8192;
Сделано это было до меня и я не понимаю какую роль здесь играет SAMPLE BY Id.
Доку я конечно же читал, но, как часто бывает в связке Я+дока кликхауза, сути я так и не понял.
спасибо -
SAMPLE BY Id позволяет выбрать часть дданных, а поттом умнощить на коэф. сэмплирования чтобы получить результат. Это сделано для того чтобы быстрее и меньше читать
-
это наваерное про SAMPLE BY в select, а меня интересует create table
-
Ну чтобы юзать в select, надо его в таблице определить
-
в чем может быть причина когда клика не мержит записи
например
ENGINE = ReplacingMergeTree(Changed)
PARTITION BY toYYYYMM(toDate(DayDate - 25567))
PRIMARY KEY Id
ORDER BY (Id,
DayDate)
SAMPLE BY Id
SETTINGS index_granularity = 8192;
и при этом -
у записей одинаковое значений полей из order by и они в одном партишине
конечно , в табл. есть еще и другие поля, но это же не должно влиять ? -
скорее всего optimize их схлопнет, но почему это не происходит в штатном режиме ?
-
нет никаких гарантий что КХ схлопнет данные. Может решить что не оптимально выполнять мердж данных и у вас будут дубли
-
Denny [Altinity] in ClickHouse не тормозит
нет, нету никакого дерева. Просто КХ пытается делать как можно меньше мержей и при этом чтобы кол-во партов в партиции было не очень большим, там хитрая формула с кучей параметров, с экспонентами и учетом загрузки пула мержей. Т.е. если вы постоянно вставляете в таблицу A то она мержится, при этом в таблице B мержей не будет если вы туда не делаете инсертов, хотя там скажем 50 партов в партиции. И зачем-то мержер планирует в мерж парты примерно одинакового размера, зачем?, никто уже не знает, и при этом парты должны мержится в строгом порядке, чтобы не ломать логику replacing, collapsing.
-
я думал что клика сама выбирает для схлопывания, но так чтоб вообще никогда ???
т.е. хочу схлопну , не захочу не схлопну ? как то так ? -
это пример с тест. базы которая совсем не загружена - времени для мержей у клики валом
-
вы обязаны писать запросы на чтение с учётом того что у вас есть дубли. Смержит или нет - вы не знаете
-
для теста запустите optimize, чтобы удостовериться что дублей не будет и вы правильно вставили данные и настроили всё
-
т.е. лепить кругом final (что в больш. случаев и есть) или какие то варианты с group by, order by+limit 1 и.т.д. ?
но ведь тогда final совершает в данный момент много лишней работы кот. клика могла бы сделать "по-свободе" -
Зато не тормозит
-
-
так в том и дело что final тормозит причем нехило ((
-
-
нафига нужет механизм который совершенно не прогнозируем ?
-
практика показала, что если требуется гарантия удаление дублей, значит что то делаешь не правильно изначально. финал нужно юзать только если в историческиз данных что то исправить надо
-
то что наша задача "не под клику" я понял давно.
но все равно это очень странная логика хочу делаю/ хочу не делаю. -
ничего странного, все как в жизни
-
Надо просто уметь его готовить.
-
я у себя такие данные сначала коллекчу в постгрес, потом мержу как мне надо и пачкой отправляю в клик уже готовыми
-
есть какаято настройка
fast_merge=true ? ) -
Есть понимание того, как работают мержи, FINAL и особенности данных и их вставки в базу.
-
-
у меня было понимание что мержи работают по order by, выполняются в фоне и не сразу.
-
Ну почему, множество людей начинают пользоваться кх без всяких ДБА со знанием.
Порог входа довольно низкий.
Плюс можно обратиться к нам в altinity.com например, мы можем проконсультировать -
-
Ну а кб нашу смотрели?
kb.altinity.com? -
-
-
Ну опенсорс, документация долгое время писалась во многом разрабами и в основном в добровольно-принудительном порядке.
-
а у вас получается просто в принудительном? )
-
Нас скорее принуждает нежелание писать одно и тоже много раз)
Проще в ссылку ткнуть -
Да, суть в том что Replacing просто помогает вам сэкономить место, а не убирать дубли)
почитайте про optimize final + do_not_merge_across_partitions_select_final
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-final-clause-speed/
https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree/ -
теперь почитал, спасибо
но в офф. доке гдето было написано что мержи выполняются в среднем через 15 мин, а про NEVER только у вас ))
в общем, дока вводит в заблуждение, хотя, как говорится, легко обмануть того кто хочет быть обманутым ) -
Почитаю вашу, спасибо.
-
На самом деле щас довольно много компаний/людей занимаются улучшением UX в контексте использования ReplacingMergeTree (мы в том числе, например делаем sink коннектор для репликации из mysql в кх с помощью Debezium) Так что возможно частично ваша боль будет поправлена в ближайшем будущем.
Например вот небезынтересный коммент к PR
https://github.com/ClickHouse/ClickHouse/pull/41005#issuecomment-1300624243[RFC] Replacing merge tree new engine by youennL-cs · Pull Request #41005 · ClickHouse/ClickHouseChangelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Enrichment of the existing ReplacingMergeTree engine to a...
-
спасиб
-
а вообще, final на свежесмерженой таблице (условно когда схлопывать будет нечего) будет отрабатывать быстрее или final в любом случае займет какоето время независимо от наличия или отсутствия дублей ?
-
а как он узнает, что мержить нечего, пока не сравнит значения sorting key?🤔
-
Ну в system.parts видно
-
Ну например, если включит настройку не мержить между партициями, и у вас в партиции только 1 парт
-
и в нем дубликаты, потому что это была одна вставка
хотя если level > 0, то можно и пропустить -
Щас под дефолту кх делает мерж optimize_on_insert настройка
-
и ее можно включать / отключать сколько угодно
или на уровне парта хранится, какая была настройка в момент вставки? -
Ну если отключите ССЗБ
-
Вы ведь таким образом можете и просто сделать ATTACH PART FROM TABLE
-
забавно, Denny писал тут прямо обратное
-
А как вообще дубли оказываются в одном парте?
Их же там не должно быть в принципе -
В одном инсерте могут быть
-
https://github.com/ClickHouse/ClickHouse/pull/19375/files#diff-a2e0909d75f772d3b9b704923917d686f10aa2167547e7ce8c5cec5f54c11f5dR1392
Ну вообще тут кстати стоит данное ограничение, хотя с учетом optimize_on_insert оно не так критичноImprove do_not_merge_across_partitions_select_final optimization. by Avogar · Pull Request #19375 · ClickHouse/ClickHouseI hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en Changelog category (leave one): Performance Improvement Changelog entry (a user-readable short descriptio...
-
Я писал не в этом контексте. На самом деле это сто раз уже тут обсуждали, если в партиции один парт и его level >0 то final как бы можно не делать. Но разработчики кх думают что это плохая идея. Я так понимаю что на том уровне абстракции невозможно это понять.
-
сорри, значит я не так понял
-
Мы в Альтинити предлагаем выключать эту настройку потому что инсерты намного медленнее работают.
В любом случае фичи с автоматическим выключением final нет и не планируется. -
Ну да, не подумал.
-
Особенно смешно получается в мат.вью - сделали group by, и теперь затормозим инсерт чтобы помержить то что только что помержили в groupby
-
спасибо за инфу!
-
Хм, можно ли в определение MAT VIEW дописать эту настройку и сработает ли она так тогда
-
Нельзя. Кажется Алексей хотел на уровне кода выключать для случая мат.вью, но так и не сделали.
Я вообще не видел чтобы эта штука помогала. Это ж сколько дубликатов надо в инсерте послать? Типа заинсертить 100% дублей? -
> Нельзя. Кажется Алексей хотел на уровне кода выключать для случая мат.вью, но так и не сделали.
Мне кажется на эту тему даже issue нет -
optimize_on_insert should be disabled by default · Issue #25724 · ClickHouse/ClickHouse
optimize_on_insert=1 \ insert Elapsed: 14.278 sec. optimize_on_insert=0 \ insert Elapsed: 5.833 sec. create table SMT(A Int64, B Int64, C Int64, D Int64, E Int64, F Int64) Engine=SummingMergeTree o...
- 04 November 2022 (80 messages)
-
Мы знаем, что ch нуждается в перезаписи на SQL после обновления удаления, чтобы получить правильные данные, и можно спросить, почему вместо того, чтобы прочитать данные на нижнем двигателях, он передал их SQL для отображения обработки?
-
Всем привет!
Подскажите, после обновления кликхауса до версии 21.8.15.7 в одной из таблиц начала теряться часть данных за предыдущие два дня. Причём за сегодняшний день они не теряются, но как только наступает следующий день, то за прошедший данные по немногу на разных шардах начинают исчезать. До обновления всё работало отлично. Если данные восстановить, то они через 10-20 минут опять пропадают. -
Может быть вы Федора? Хотя данные конечно не посуда, но тоже любят чистоту
-
-
У вас ттл есть ?
-
Какой движок у таблицы
-
Ищите ТТЛ) не надо смеятся
-
-
-
значение rows в system.parts тоже меняется для активных партов этих дней?
-
-
Добрый день пожалуйста кто-нибудь может помочь тут что нужно делать.
Периодически (раз в 1-2 суток) появляются бесконечные записи в логи подобные этой:
2022.11.04 10:41:18.947879 [ 487729 ] {} <Error> void DB::MergeTreeBackgroundExecutor<DB::MergeMutateRuntimeQueue>::routine(DB::TaskRuntimeDataPtr) [Queue = DB::MergeMutateRuntimeQueue]: Code: 241. DB::Exception: Memory limit (total) exce
eded: would use 67.42 TiB (attempt to allocate chunk of 4357136 bytes), maximum: 64.00 GiB. (MEMORY_LIMIT_EXCEEDED), Stack trace (when copying this message, always include the lines below): -
Зачем ему 67 TB памяти вдруг? Уже поднял с 16 до 32 и с 32 до 64 - безрезультатно. Есть вариант поставить 0 - без лимита, но как-то стремно с такими безумными запросами))
И CH входит в бесконечный busy loop пожирая 100% cpu.
При чем как я понимаю сейчас он нигде там не используется пока. -
Смотрите фоновые процессы - мержи (select * from system.merges ), мутации (select * from system.mutations where not is_done ) - что то кушает неслабо.
-
-
Версия кх? 22.4?
-
22.1.3.7
-
В смысле в портах? Типа freebsd?
-
Никто не знает, как побороть проблему с тем, что последовательные HTTP запросы из одной сессии кидают “Session is locked”?
Вот нашёл такой issue https://github.com/ClickHouse/ClickHouse/issues/4003
Но как будто он не до конца пофикшенSequential HTTP requests can lead to "Session is locked" error · Issue #4003 · ClickHouse/ClickHouseHi, I'm getting a (373) DB::Exception: Session is locked by a concurrent client. error sometimes upon executing two sequential HTTP requests with the same session_id. Below you can see an e...
-
даа, так точно
-
Можете в user. xml прописать
-
<clickhouse>
<users>
<default>
<allow_experimental_object_type>1</allow_experimental_object_type>
</default>
</users>
</clickhouse>
Так должно сработать? -
У вас есть предложение о том, как решить проблему? 🙁
-
не пользоваться freebsd (я серьезно)
-
Всем привет
подскажите плз, вот у меня есть таблица с логом сервиса в виде CSV
можно ли как-то средствам КХ разгребать этот CSV текст в отдельную таблицу чтобы данные были по столбцам .... и так чтобы это не VIEW таблица была, а самостоятельная таблица чтобы можно было нормально индексы использовать ? -
Причину можно узнать? ( а что посоветуете взамен?
-
КХ freebsd билд не тестируется и никем не используется и там вечные проблемы с памятью.
взамен? использовать КХ под линуксом (ubuntu) и только с самыми свежими ядрами. -
КХ не умеет автоматически загружать данные из файлов.
Используйте vector.dev -- это очень быстрая прога, отдельный бинарник, и он умеет читать логи (файлы) , понимает ротацию, умеет буферизовать запись в КХ, очень просто конфигурится
https://vector.dev/LinkA lightweight, ultra-fast tool for building observability pipelines
-
Integrating Vector with ClickHouse | ClickHouse Docs
How to tail a log file into ClickHouse using Vector
-
не тут вопрос не в загрузке из файлов .... у меня в КХ в строке тест в формате CSV ну типа "112312", "234234", "2345234"
мне нужно создать паралельно таблицу где эти данные будут по столбцам ...
Первая идея была сделать скрипт по крону который бы читал новые данные и пихал бы их в отдельную таблицу, но хочется чтобы не было лишнего и был бы онлайн режим -
Ну пишите сразу в нормальном формате, зачем хранить csv строку в колоночной базе?
-
КХ умеет выводить типы и названия столбцов из CSV
вы хотите чтобы каждый файл был в отдельной таблице? (структура у файлов одинаковая?) -
FileLog engine никто не юзает?
-
-
-
Господа, привет, а Clickhouse не умеет креденшиалсы от S3 получать по взрослому внутри K8S? https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html ?Using a supported AWS SDK - Amazon EKS
The containers in your pods must use an AWS SDK version that supports assuming an IAM role through an OpenID Connect web identity token file. AWS SDKs that are included in Linux distribution package managers might not be new enough to support this feature. Be sure to use the following versions, or later, for your SDK:
-
-
Через IAM роль умеет
use_environment_credentials -
а есть инфа что для этого нужно включить в конфиге?
-
я вот в этот мануал смотрел https://clickhouse.com/docs/en/guides/sre/configuring-s3-for-clickhouse-use/ но не нашелUse S3 Object Storage as a ClickHouse disk | ClickHouse Docs
Configure AWS IAM user, create an S3 bucket, and use that bucket as a ClickHouse disk.
-
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-s3
use_environment_credentialsMergeTree | ClickHouse DocsThe MergeTree engine and other engines of this family (*MergeTree) are the most robust ClickHouse table engines.
-
Благодарю, получается что нужно будет указать только endpoint до бакета а сикрет CH уже подтянет из env. переменных?
-
И надо задать use_environment_credentials
-
-
да нету у меня файлов )))
у меня есть таблица в столбце типа Text хранятся данные в виде "sdfsdfsd", "sdfsdfsdf", "sdfsdfsdf"
кол-во столбцов одинаовое
мне нужно создать таблицу отдельную куда должны писаться эти данные в отдельные 3 столбца -
т.е. по сути мне нужно смапить как-то по regex или еще как-то данные в отдельные столбцы и сделать так чтобы КХ это делал сам по мере поступления данных в исходную таблицу
-
на сколько я понимаю это материализованное представление ....
-
да, до удаления данных был 1 активный кусок с 15892 строками, а после удаления остался тоже один кусок с 8192 строками. Странно четкое число
-
Привет! Подскажите, пожалуйста, можно ли вставить через HTTP данные в tsv, при этом статично определив для каждого запроса значение отсутствующей колонки (без добавления в сами данные)?
-
-
Это о какой фиче речь? И таймстампы автоматом распарсит?
-
В чем прикол? Не догоняю
-
Видимо телега лаганула 😳😅
-
Можно ли ее в конфиг положить?
-
Вот так не подхватывается.
-
а делал кто декларативный сервис управлением политик доступа? Чтобы чисто ямлик описал и оно его применяло
-
Так кажется, что нормально не файлики писать, а сикуле-команды слать. По крайней мере, так в остальных бд )
-
ну декларативно хочется типа
-
Возьми в руку питон (он круто yaml парсит), и три часа времени )
-
ГОТОВОЕ хочется
-
Подайте плиз идею, на лету меняем имена колонок с таблице (для апгрейда кх), нужно составить выражение для SELECT, чтобы умело работать и со старым именем, и с новым. В таблице будет или старое, или новое. Версия 21.3.
Что пришло в голову, вместо
old_array_values[indexOf(old_array_names, field_name)]
делать
arrayConcat(COLUMNS(‘old_array_values’), COLUMNS(‘new_array_values’))[indexOf(arrayConcat(COLUMNS(‘old_array_names’), COLUMNS(‘new’_array_names)), ‘field_name’)]
Но есть ли другие варианты? -
Декларативное в ямлике не помню, но был доклад у Deutsche Bank, как они делали сервис, что им abac реализовал
-
Нy чтo, пoлeтeли?
В нaличиe ocобыe, нeблoкиpyeмыe Google aккayнты!
Oткpывaeтe aкк и cхoдy зaливaeтe тpаф на любyю вepтикaль, вce acпeкты нacтpoeны пpeдвapитeльнo.
Этo ТOП aккayнты oт БЦ (МCC)
1) Oплaтa в usdt
2) 15% кoмиccия oт пoпoлнeния
3) Минимальнaя cyммa попoлнeния 500$ -
Ого скам
-
-
input | ClickHouse Docs
input(structure) - table function that allows effectively convert and insert data sent to the
-
sudo echo '"sdfsdfsd", "sdfsdfsdf", "sdfsdfsdf"' > /var/lib/clickhouse/user_files/file.csv
select * from file('file.csv');
┌─c1───────┬─c2────────┬─c3────────┐
│ sdfsdfsd │ sdfsdfsdf │ sdfsdfsdf │
└──────────┴───────────┴───────────┘
create table A Engine Memory as select * from file('file.csv');
select * from A;
┌─c1───────┬─c2────────┬─c3────────┐
│ sdfsdfsd │ sdfsdfsdf │ sdfsdfsdf │
└──────────┴───────────┴───────────┘ -
в profile секции
cat /etc/clickhouse-server/users.d/allow_experimental_object_type.xml
<?xml version="1.0" ?>
<clickhouse>
<profiles>
<default>
<allow_experimental_object_type>1</allow_experimental_object_type>
</default>
</profiles>
</clickhouse> -
Спасибо! В понедельник попробую..
-
А * :) почему не подходит?
-
Я уже додумался, что наверное arrayConcat не нужен, но просто ищу новые идеи и подходы.
-
Добрый вечер. Столкнулся с проблемой после ввода двух новых нод в кластер.
На одной из нод регулярно возникает ошибка о том, что таблица в ридонли, хотя при селекте из system.metrics metric="ReadonlyReplica" пусто, подскажите, пожалуйста, куда можно ещё глянуть по проблеме. -
select * from system.replica where is_readonly format Vertical
там смотри поле zookeeper_exception
ну и в логе КХ ретроспективно все есть
/var/log/clickhouse-server/clickhouse-server.err.log
/var/log/clickhouse-server/clickhouse-server.log -
Спасибо. Помогло пересоздание таблиц. Судя по логам - спустя неоторое время произошла активация таблиц.
Подскажите, пожалуйста, почему после перезапуска кх таблицы переходят в ридонли? -
😱Барыга перестал отвечать на звонки?
👍GREEN ROOM Всегда онлайн
МЕГА АКЦИЯ В🍀 GREEN ROOM RBOT
❤️🔥Прямо сейчас стартует АКЦИЯ ❤️🔥
При пополнении кошелька бота на сумму от:
🔥2000₽ получает бонус 1000 ₽.
🔥4000₽ получает бонус 2500 ₽.
🔥6000₽ получает бонус 4500 ₽.
-У нас только наход
-Только лучшее качество
-Лучшие цены
-Моментальная круглосуточная поддержка
-Огромный выбор товара
-Мы лучшие на рынке
🍀 GREEN 🍀
🍀 GREEN 🍀
🍀 GREEN 🍀 -
-
никогда такого синтаксиса не видел. https://clickhouse.com/docs/en/sql-reference/statements/select/limit-by/LIMIT BY Clause | ClickHouse Docs
A query with the LIMIT n BY expressions clause selects the first n rows for each distinct value of expressions. The key for LIMIT BY can contain any number of expressions.
-
Это значит выбрать для каждого уникального id вторую и третью строку, где он встречается.
-
Ничего себе
-
офигеть, не знал про эту фичу, спасибо
- 05 November 2022 (51 messages)
-
всем привет! я знаю, что кликхаус это не про обновление
но есть задача - вставить новую колонку, сделать расчеты значений из других колонок и забить эти данные в новую колонку. в таблице 220 млн строк
и периодически будет нужда вставлять новые колонки
можете подсказать решение? я пока вижу только создание новых таблиц вместо колонок -
Что значит просчет? можно типа рассчитать из зпачений других колонок в каждй строке?
-
да, все верно. надо произвести расчеты из других колонок и результат забить в новую
-
Ну так создавайте новую колонку с дефаулт
Alter table t add column new Int64 default old1*2+old2 -
-
-
В общем-то можно сделать словарь с source executable и считать кодом на чем угодно
-
-
Раз зашла речь о словарях - я так и не нашел способа сделать "виртуальный" словарь с источником данных одним из CTE в том же запросе. Чтобы обойти ограничения на создание словарей.
Такое в принципе возможно ? -
Хочется реализовать хоть так иерархические запросы
-
Всем привет! Подскажите пожалуйста, есть ли у КХ, что нибудь на подобии Hardening
-
-
-
добрый день! господа, помогите разобраться с тремя связанными вопросами:
1. повесил на обычную MT-таблицу TTL, в списке мутаций появилась MATERIALIZE TTL, которая подозрительно долго работала, забивая все ядра на 100%. при этом аналогичный по сути запрос ALTER TABLE t DELETE WHERE timestamp < now() - INTERVAL отрабатывает в десятки, если не сотни раз быстрее. почему так?
2. после завершения этой мутации SELECT min(timestamp) FROM t выдает нулевое время 1970-01-01 00:00:00 - но записей с такой временной меткой в таблице нет и быть не могло. как такое возможно, это же баг?
3. после добавления TTL таблицы элементарный запрос SELECT timestamp FROM t ORDER BY timestamp LIMIT 1 явно приводит к линейному чтению всей таблицы и занимает минуты, когда раньше отрабатывал мгновенно. опять же, почему так, разве таблицы MT не проиндексированы по времени тем или иным образом?
спасибо! -
Привет. Имеется кластер, в нём 2 шарда, в каждом по 2 реплики (в итоге 4 ноды). Создаю replicated таблицу events_local в кластере, а затем distributed таблицу events_distributed тоже в кластере. Это нормально, что в distributed таблицах данных дублированы?
CREATE TABLE default.events_local ON CLUSTER mycluster
(
`event_type` UInt32,
`date` Date
)
ENGINE = ReplicatedMergeTree('/clickhouse/{cluster}/tables/events_local', '{replica}')
PARTITION BY date
ORDER BY event_type
CREATE TABLE default.events_distributed ON CLUSTER mycluster
(
`event_type` UInt32,
`date` Date
)
ENGINE = Distributed('{cluster}', 'default', 'events_local', rand()) -
-
В смысле задублированы?
У вас половина данных на одном шарде, а вторая половина на другом. Когда вы обращаетесь к локал таблице то видите только 50% данных, а дистриб ходит в оба шарда и возвращает 100% -
Без DDL тут гадать можно долго
-
create table или что-то еще?
-
Да
-
Делал insert в replicated таблицу, 2 элемента. В replicated таблицах по 2 элемента, в distributed таблицах по 4 элемента
-
-
Я вижу что у вас одни и те-же данные на 4 репликах. На какие сервера вы делаете вставку?
-
я сделал только 1 вставку в events_local (replicated таблица) на server4, вставил 2 строки
-
Что в select * from system.clusters ?
-
Дак над репликейтед таблицами не нужна distribution
-
-
Я понял, у вас в ддл локальных таблиц не указан макрос шарда
-
спасибо, сейчас исправлю)
-
Конечно же нужна если шардов>1, иначе как запрос соберёт все данные?
-
работает, благодарю)
-
обновление через словарь работает, спасибо! по этой статье затестил - https://kb.altinity.com/altinity-kb-queries-and-syntax/update-via-dictionary/
но тут еще один вопрос возникает, насколько тяжело базе будет обновить ~250 млн строк данным способом? или намного эффективнее все же будет вместо колонки, создать новую таблицу ? -
Добавить колонку - это просто создать новый файл, не надо ничего обновлять. 250млн может за минуту сделать если словарь в памяти. Новую таблицу создать будет в 10-100 раз медленнее в зависимости от числа колонок
-
Тут непонятно, вы говорите про рассчет из других колонок.
Если все эти значения которые нужны принадлежат одной и той же строки (те все происходит в контексте строки) вам словаоь вообще не нужнн -
нет, нужные значения будут не всегда в одной строке
есть случаи, когда для расчета одной строки необходимо будет использовать данные из двух или более строк -
-
Complex key layoutы смотрите
-
вроде разобрался, спасибо :)
CREATE DICTIONARY update_dict
(
`id` UUID,
`value` Float32
)
PRIMARY KEY id
SOURCE(CLICKHOUSE(TABLE 'test_update_source'))
LIFETIME(MIN 0 MAX 10000)
LAYOUT(COMPLEX_KEY_HASHED());
теперь словарь с UUID
апдейт колонки сделал так:
ALTER TABLE binance_futures_candles
UPDATE value = dictGet('default.update_dict', 'value', toUUID(id)) WHERE dictHas('default.update_dict', toUUID(id)); -
а почему вдруг Update и зачем? Вам же новый столбец надо было сделать. Я бы сделал alter table table add column value String default dictGet('default.update_dict', 'value', id); А потом modify column чтобы отвязать словарь.
-
да, получилось - так намного проще, спасибо
а можно чуть подробнее насчет отвязки словаря? про это не в курсе был -
ALTER TABLE table_name MODIFY column_name REMOVE DEFAULT;
-
после отвязки колонка обнуляется
-
-
значит вы её не материализовали на диск, она у вас на лету считалась. Вы как по итогу добавили? Через ADD COLUMN?
-
да
ALTER TABLE binance_futures_candles ADD COLUMN value4 Float32 default dictGet('default.update_dict2', 'value', id)
именно через этот способ такая проблема появилась. через UPDATE вроде все ок
про материализацию не в курсе еще -
https://clickhouse.com/docs/en/sql-reference/statements/alter/column/#materialize-column
порядок действий
- ADD COLUMN ... DEFAULT ...
- MATERIALIZE COLUMN ...
- ждём конца мутации SELECT * FROM system.mutations WHERE NOT is_done
- MODIFY ... REMOVE DEFAULT; -
все ок, данные остаются после отвязки. но теперь словарь не дропается(
DROP DICTIONARY update_dict3
выдает ошибку
SQL Error [630] [07000]: Code: 630. DB::Exception: Cannot drop or rename default.update_dict3, because some tables depend on it: default.binance_futures_candles. (HAVE_DEPENDENT_OBJECTS) (version 22.1.3.7 (official build))
, server ClickHouseNode(addr=http:localhost:8123, db=default)@1293127517
никак не получается избавиться от словаря
через UPDATE все ок было. или он медленнее справляется с этим? -
а вы default выражение, которое ссылается на словарь, точно удалили?
-
да. вот создаю словарь новый:
CREATE DICTIONARY update_dict6
(
`id` UUID,
`value` Float32
)
PRIMARY KEY id
SOURCE(CLICKHOUSE(TABLE 'test_update_source'))
LIFETIME(MIN 0 MAX 10000)
LAYOUT(COMPLEX_KEY_HASHED());
потом добавляю столбец:
ALTER TABLE binance_futures_candles ADD COLUMN value6 Float32 default dictGet('default.update_dict6', 'value', id)
материализую:
ALTER TABLE binance_futures_candles MATERIALIZE COLUMN value6;
дожидаюсь пока мутация сработает и отвязываю словарь:
ALTER TABLE binance_futures_candles MODIFY COLUMN value6 REMOVE DEFAULT;
словарь точно отвязался, потому что при повторном выполнении этого запроса вылезает ошибка:
DB::Exception: Column `value6` doesn't have DEFAULT, cannot remove it. (BAD_ARGUMENTS)
далее пробую дропнуть словарь:
DROP DICTIONARY update_dict6
и ошибка:
SQL Error [630] [07000]: Code: 630. DB::Exception: Cannot drop or rename default.update_dict6, because some tables depend on it: default.binance_futures_candles. (HAVE_DEPENDENT_OBJECTS) (version 22.1.3.7 (official build))
, server ClickHouseNode(addr=http:localhost:8123, db=default)@1293127517 -
забавно )
https://github.com/ClickHouse/ClickHouse/issues/35905Test 00140_rename `DB::Exception: Cannot drop or rename test.hits, because some tables depend on it: db_dict.cache_hits` · Issue #35905 · ClickHouse/ClickHouse2022-04-02 03:32:18 [cc2342a20ed8] 2022.04.02 03:32:18.009225 [ 1041 ] {5ed14b87-6522-4a8c-bd4d-36a1b8fa5483} executeQuery: Code: 630. DB::Exception: Cannot drop or rename test.hits, because some t...
-
у вас версия довольно старая и не очень удачная, я бы попробовал на 22.3.14 обновиться. Ну или через UPDATE делать
- 06 November 2022 (14 messages)
-
вот и мирк подвезли )
Introducing Topics in Groups
• Groups with more than 200 members can now have their discussions organized into topics.
было б неплохо здесь ввести базовые топики.
https://telegram.org/file/464001316/11f12/M7mpWWooRzQ.8929282.mp4/ef5432174ec78e7910 -
Всё новое - хорошо забытое старое )
-
Добрый вечер! Кто-то может подсказать по параллельному обращению к кликхаус серверу через питоновскую библиотеку clickhouse-driver?
При подключении передаю sll crt файл. При попытке обращения разными тредами к одному и тому же коннекту, получаю следующую ошибку (лог прикладываю) при параллельном выполнении запросов. Если перед любым запросом принудительно создавать новый коннект, то ошибки нет, но хочется не создавать много лишних коннектов, если возможно.
Запускаюсь примерно так:
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
for cred in creds:
executor.submit(functions, params)
коннекчусь
ch_client = Client(
host=...,
port=...,
database=...,
user=clickhouse_user,
password=clickhouse_password,
secure=True,
ca_certs=os.path.join(os.getcwd(), 'YandexInternalRootCA.crt')
) -
-
Работает странно.
Если включить, то не отображает сообщения вообще, говорит что нет тем и предлагает создать тему. То есть, темы не совместимы с обычными сообщениями. Это в клиенте под Linux.
В клиенте под iPad просто нет кнопки, чтобы включить темы.
Отложим на неопределённое время. -
Ок, будем ждать допиливания до нормального состояния )
-
У вас 10 тредов, на каждый из них и создайте соединение.
-
Вопрос в том как асинхронно ходить в clickhouse ? Поможет вот это https://github.com/mymarilyn/aiochGitHub - mymarilyn/aioch: aioch - is a library for accessing a ClickHouse database over native interface from the asyncio
aioch - is a library for accessing a ClickHouse database over native interface from the asyncio - GitHub - mymarilyn/aioch: aioch - is a library for accessing a ClickHouse database over native int...
-
-
В𝚎ч𝚎poчeк🧕🌸. 𝖮тⲕрылся новый обменниⲕ криптоⲃaлюты 🤩FixingFloat🤩, сейчaс тaм xоpoшие кypc у мoн𝚎т, а по мо𝚎мy промoκoдy вы получите +1.5% ⲕ любoй операции😘🤑.
❤️💜💖💜❤️
fixingfloat.com/?ref=4bda6738 -
Оно адски медленное. Если производительность важна, то лучше aiohttp+'X-ClickHouse-Format': 'JSON'+orjson
-
😱Барыга перестал отвечать на звонки?
👍GREEN ROOM Всегда онлайн
В нашем боте есть все, что тебе надо для отдыха, тусовок и покорения незримого мира нагваля.
-У нас только наход
-Только лучшее качество
-Лучшие цены
-Моментальная круглосуточная поддержка
-Огромный выбор товара
-Мы лучшие на рынке
🍀 GREEN 🍀
🍀 GREEN 🍀
🍀 GREEN 🍀 -
-
Settings | ClickHouse Docs
allownondeterministicmutations
- 07 November 2022 (133 messages)
-
-
🙋♀️ Приветствуем!
Мы производители женской одежды из России. В нашем канале можно изучить ассортимент одежды и сделать заказ в пару кликов.
🎁 Доставка БЕСПЛАТНО от 15000 руб.
💳 Оплата наличным и безналичным расчетом
✈️ Доставка по России и СНГ
Желаем приятных покупок! ↩️
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy♦️ ПЕРВЫЙ МОДНЫЙ КЛУБ ♦️Первый клуб для оптовиков. То самое место, где встречаются производители и оптовые покупатели одежды. Изучайте ассортимент и делайте заказ в пару кликов. 😎 Welcome to the club!
-
🙋♀️ Приветствуем!
Мы производители женской одежды из России. В нашем канале можно изучить ассортимент одежды и сделать заказ в пару кликов.
🎁 Доставка БЕСПЛАТНО от 15000 руб.
💳 Оплата наличным и безналичным расчетом
✈️ Доставка по России и СНГ
Желаем приятных покупок! ↩️
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy♦️ ПЕРВЫЙ МОДНЫЙ КЛУБ ♦️Первый клуб для оптовиков. То самое место, где встречаются производители и оптовые покупатели одежды. Изучайте ассортимент и делайте заказ в пару кликов. 😎 Welcome to the club!
-
🙋♀️ Приветствуем!
Мы производители женской одежды из России. В нашем канале можно изучить ассортимент одежды и сделать заказ в пару кликов.
🎁 Доставка БЕСПЛАТНО от 15000 руб.
💳 Оплата наличным и безналичным расчетом
✈️ Доставка по России и СНГ
Желаем приятных покупок! ↩️
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy♦️ ПЕРВЫЙ МОДНЫЙ КЛУБ ♦️Первый клуб для оптовиков. То самое место, где встречаются производители и оптовые покупатели одежды. Изучайте ассортимент и делайте заказ в пару кликов. 😎 Welcome to the club!
-
🙋♀️ Приветствуем!
Мы производители женской одежды из России. В нашем канале можно изучить ассортимент одежды и сделать заказ в пару кликов.
🎁 Доставка БЕСПЛАТНО от 15000 руб.
💳 Оплата наличным и безналичным расчетом
✈️ Доставка по России и СНГ
Желаем приятных покупок! ↩️
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy♦️ ПЕРВЫЙ МОДНЫЙ КЛУБ ♦️Первый клуб для оптовиков. То самое место, где встречаются производители и оптовые покупатели одежды. Изучайте ассортимент и делайте заказ в пару кликов. 😎 Welcome to the club!
-
🙋♀️ Приветствуем!
Мы производители женской одежды из России. В нашем канале можно изучить ассортимент одежды и сделать заказ в пару кликов.
🎁 Доставка БЕСПЛАТНО от 15000 руб.
💳 Оплата наличным и безналичным расчетом
✈️ Доставка по России и СНГ
Желаем приятных покупок! ↩️
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy♦️ ПЕРВЫЙ МОДНЫЙ КЛУБ ♦️Первый клуб для оптовиков. То самое место, где встречаются производители и оптовые покупатели одежды. Изучайте ассортимент и делайте заказ в пару кликов. 😎 Welcome to the club!
-
🙋♀️ Приветствуем!
Мы производители женской одежды из России. В нашем канале можно изучить ассортимент одежды и сделать заказ в пару кликов.
🎁 Доставка БЕСПЛАТНО от 15000 руб.
💳 Оплата наличным и безналичным расчетом
✈️ Доставка по России и СНГ
Желаем приятных покупок! ↩️
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy
https://t.me/+LjX8CWjmxWg5YTYy♦️ ПЕРВЫЙ МОДНЫЙ КЛУБ ♦️Первый клуб для оптовиков. То самое место, где встречаются производители и оптовые покупатели одежды. Изучайте ассортимент и делайте заказ в пару кликов. 😎 Welcome to the club!
-
/report
-
Привет. У меня такой кейс – надо удалить данные из таблицы, а потом накатить их заново из другой таблицы с помощью clickhouse-copier. Следовательно есть 2 вопроса:
1. Насколько тяжелая операция удаления 50 млн записей и можно ли так делать
2. Если в партиции не остается данных, будет ли она удалена? Чтобы не было конфликтов при копировании по партициям в clickhouse-copier -
если у вас обычная (non Replicated) MergeTree, то проблем нет. Так оно и будет (для обычных инсертов). Если же вы построили кластер, то становится интереснее:
> By default, an INSERT query waits for confirmation of writing the data from only one replica. If the data was successfully written to only one replica and the server with this replica ceases to exist, the stored data will be lost. To enable getting confirmation of data writes from multiple replicas, use the insert_quorum option. -
50 млн это пренебрежительно мало (если конечно у вас там не пара тысяч колонок). просто сделайте truncate и вставьте данные через insert/select
-
ДУблирую еще раз свой вопрос - может у кого-то будут свежие мысли:
Коллеги а почему могут возникать дубликаты при вставке в distributed таблицу и дубликаты попадают в одну и ту же шарду
В чем может быть причина?
Причем дубликаты не на разных шардах а в одной и той же шарде всегда. Ошибка в рамках двух кластеров воспроизводится и в рамках однго не воспроизводится, конфиги одинаковые -
Можно как то ограничить время хранения данных в базе данных ? либо как то ограничить место занимаемое базой данных ?
-
https://clickhouse.com/docs/ru/sql-reference/statements/alter/ttl/
Возможно поможетМанипуляции с TTL таблицы | ClickHouse Docsmanipuliatsii-s-ttl-tablitsy}
-
Да не, я хотел просто дать доступ пользователям создавать в отдельной базе данных создавать самим таблицы, и как то всё это ограничить
-
раз в сутки ходим кроном по system.tables, находим все юзерские таблицы без TTL, делаем alter table modify TTL :)
-
-
-
-
Привет! А есть ли какой-то простой способ сгенерировать рандомную дату в определенном диапазоне ?
-
Склеить 3 числа из random функции.
-
Ну, где-то так оно и вышло %)
WITH
toUnixTimestamp(toDateTime('2022-09-01')) AS start,
toUnixTimestamp(toDateTime('2022-11-07')) AS end
SELECT fromUnixTimestamp(start + (rand() % (end - start + 1))) as ts -
Добрый день коллеги. Есть следующая ситуация: База большая, под 310 Гб вся таблица. Соответственно при запросе из графаны вида SELECT count(success) FROM table WHERE ( t_stamp > $__fromTime ) AND ( t_stamp <= $__toTime ) AND success = '1' (а таких запросов на дэшборде десять штук (на разные метрики и график) часть ответов у меня вываливается в ошибку (т.. видимо зависают селекты к базе). Можно ли как-то оптимизировать запросы? Разделять таблицу по месяцам не могу. Таблица мерджтри.
-
select today() + interval rand(123) % 10 day ;
-
Хм, интересный способ, спасибо )
-
В SQL вобще и в КХ в частности довольно прилично сделана работа с датой-временем. Надо этим пользоваться, тут-же не plain C :)
-
Сила привычки ))
-
После XX лет на сях пришлось делать пару фич в КХ %)
-
select toDateTime('2022-09-01') + interval rand(123) % 96000 minute ;
С виду получилось ОК :) -
Привет! Подскажите пожалуйста есть ли более эффективные способы поиска дублей по 1 колонке / нескольким колонкам / всем колонкам в CH чем обычный distinct?
-
а как distinct помогает искать дубли? или вы имели в виду "удаление дублей"
-
Вопрос не имеет смысла без контекста. Любой такой поиск основан на группировке. Но важны оптимизации. А они зависят от того что вы делаете. Почитайте тут для начала - https://kb.altinity.com/altinity-kb-queries-and-syntax/distinct-vs-group-by-vs-limit-by/DISTINCT & GROUP BY & LIMIT 1 BY what the difference
Page description for heading and indexes.
-
Какой коннектор используете ? Есть коннектор 2.0
-
-
Оптимизировать - можно (всегда). Но там миллион вариантов. Вы бы чего-нибудь сказали полезного про таблицу и про данные.....
-
create table if not exists linear_ag
(
t_stamp DateTime default now(),
date Date default today(),
dow UInt8,
hod UInt8,
adv_id UUID,
terminal_id String,
content String default 'NaN',
business_unit Nullable(String) default CAST('NaN', 'Nullable(String)'),
publisher String,
vast_uri Nullable(String),
proxy_dsn Nullable(String),
success Nullable(UInt8),
city Nullable(String)
)
engine = MergeTree() PARTITION BY toYYYYMM(date) ORDER BY (date, publisher, content) SETTINGS index_granularity = 8192; -
фильтруйте по date в дашбордах
-
order by date, при этом WHERE ( t_stamp > $__fromTime ) AND ( t_stamp <= $__toTime ) AND success = '1' - у вас идет full scan
-
Даю связки под %
«Арбитраж криптовалюты»
Пишите в личку -
-
Короче у колонки t_stamp надо индекс сделать и будет летать :)
-
Если позволите, еще вопрос, как бы эту штуку теперь связать с generateRandom() ? т.е. хочется заполнить таблицу случайными данными, но из определенного диапазона. В самой таблице всего несколько полей: UUID, String, Date (из диапазона)
-
разобрался, убрал generateRandom и сделал .. FROM numbers(x)
-
-
-
А что за метеданные?
-
структура таблицы например? или если я прибью контейнер и пересоберу его снова то он сам из S3 подтащит структуру данных?
-
Я думаю вам сюда https://t.me/dbt_usersdbt & modern data stack
DBT users group Взаимное уважение и без спама. Для вакансий тег #job Dual language: russian/english
-
Спасибо
-
Всем привет, а есть ли в КХ что-то типа
https://docs.oracle.com/database/121/ARPLS/d_appinf.htm#ARPLS65237
Суть вопроса - приложение ходит через connection pool и хочется персонализировать как то запросы. Минимально - прокидывать как то информацию о том, какой пользак инициировал запрос -
уточню - приложение ходит под 1 технологическим аккаунтом, а что за пользователь дернул API который пошел в БД - вот эту инфу хочется как то добавлять в запрос
-
Вы можете в запрос в первую строчку добавить комментарий, что был за пользователь
-
И потом в query_log будете видеть его
-
ну это самый примитивный вариант, да. Но хотелось бы как то более интеллектаульно =) я уже так делал когда с airflow трекал запросы (json с нужными полями в первую строку добавлял). Но вроде как есть поля типа log_comment и всякие Settings & ProfileEvents - думал может есть какой то провославный способ это сделать
-
Ну собственно проверил да - после перезапуска clickhouse он сам структуру не подтягивает из S3 а значит мета данные надо тоже где то хранить/передовать
-
-
Добрый вечер!
У нас КХ с ЛДАП
НО
для вручную определёных юзеров нельзя определить роль :(
GRANT dwh_role TO lakehouse_engine;
Code: 495. DB::Exception: Cannot update user lakehouse_engine in users.xml because this storage is readonly: Couldn't update user lakehouse_engine. Successfully updated: none. (ACCESS_STORAGE_READONLY) (version 21.12.3.32 (official build))
это можно как то поправить? -
Приветствую!
По ощущениям вряд ли
Только если начнете использовать LDAP не как внешнее полноценное хранилище пользователей, а только как аутентификатор
https://clickhouse.com/docs/en/operations/external-authenticators/ldap/#ldap-external-authenticatorLDAP | ClickHouse DocsLDAP server can be used to authenticate ClickHouse users. There are two different approaches for doing this:
-
как лучше сделать? Подскажите?
-
к сожалению не прокатило )
-
откуда нам знать? вам виднее какие там ограничения. Можно skip index сделать - он должен неплохо работать в вашем случае, но займет сколько-то памяти сервера. Можете в where добавить интервал дату (не убирая интервал времен), но может это вам неудобно. В принципе можно и order by таблицы поменять, но это уже экстремально и скорее всего не ваш случай.
-
-
Почитайте для развития https://clickhouse.com/blog/clickhouse-grafana-plugin-2.0ClickHouse Plugin for Grafana - 2.0 Release
The 2.0 release of the ClickHouse plugin for Grafana improves filtering while adding support for HTTP and JSON.
-
всем привет. использую ClickHouseHTTP() для подключения R+Clickhouse при вызове dbGetQuery(con, "SHOW DATABASES") - отображается список, а при запросе dbListTables(con) - не отображает список таблиц. хотя если запросить данные из конкретной таблицы - то они возвращаются: dbGetQuery(con, "SELECT * from metrika_to_datalens.hits LIMIT 10"). почему не могу увидеть список таблиц? Так же не получается загрузить таблицу в clickhouse...
-
Благодарю за ссылку
-
В таблице query_log есть колонка http_user_agent, которую можно попробовать переиспользовать.
Подробнее про настройку этих параметров можно найти тут : https://github.com/ClickHouse/clickhouse-jdbc/issues/691Implement setClientInfo · Issue #691 · ClickHouse/clickhouse-jdbcFeature request: implement java.sql.Connection#setClientInfo (and ClickHouseDatabaseMetaData#getClientInfoProperties) That would allow to pass some useful metadata to database, eg. frontend user th...
-
log_comment колонку посмотрите, ее можно через настройку задать
https://github.com/ClickHouse/ClickHouse/blob/c05c1f7a34a2d5b9d0ace78df986585f125aa61d/tests/queries/0_stateless/01670_log_comment.sqlClickHouse/01670_log_comment.sql at c05c1f7a34a2d5b9d0ace78df986585f125aa61d · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
можно в SETTINGS custom params передавать, прекрасно работает
-
ClickHouse/01418_custom_settings.sql at bb832f204c6ae49e7d8dc93ed5da9fe2c0ac2751 · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
@unamedrus @mrkandreev @dj_mixer спасибо за ответы, думаю что приведённых примеров хватит :)
-
подскажите пожалуйста как и где исправить ошибку Error in .local(conn, statement, ...) :
Code: 497. DB::Exception: user: Not enough privileges. To execute this query it's necessary to have grant CREATE TABLE ON default.mtcars доступ к кликхаусу есть. но видимо. не полный - таблицы в БД не показывает, хотя к ним можно обращаться если знать названия, новую таблицу добавить не получается (возможно. сертификат не установлен или права неверно выставлены?) -
Отвечу себе сам 😄
Оказывается сейчас пока мета-данные храняться только внутри CH и их нужно или синхроинизровать через ReplicatedMergeeTree или носить руками (т.е никакого stateless) эх... а хотелось запихать в контейнер CH и я думал что вместе с S3 Disk это будет возможно... а нет -
Можно попробовать Replicated DB engine, возможно в этом случае на диске меньше метаданных хранится
-
Всем добрый вечер. Вопрос такой, требуется сделать регулярный ETL с одного кликхауса на другой (разные кластеры, разные подсети, связность есть). Данные - 1 таблица примерно на 100-200 млн. записей в сутки. Можете рекомендовать вариант непосредственно и клика в клик без использования промежуточных инструментов? Есть варианты эффективные для данного объема? Имеет ли смысл приладить к этому копир или он все же для разовых переносов/бэкапов? Спасибо
-
-
Спасибо!
-
Подскажите, хотим использовать настройку https://github.com/ClickHouse/ClickHouse/issues/29617 zookeeper_load_balancing, но получаем ошибку
<Error> ConfigReloader: Error updating configuration from /etc/clickhouse/config.xml' config.: Code: 999. Coordination::Exception: Unknown key zookeeper_load_balancing in config file (Bad arguments). (KEEPER_EXCEPTION)
Версия ClickHouse client version 22.3.11.12 (official build)Zookeeper load balancing settings · Issue #29617 · ClickHouse/ClickHouseThere are use cases when one of the zookeeper nodes is preferred - same AZ in the cloud, or you just to avoid the situations when all the clickhouse nodes will connect accidentally to the same zook...
-
старая версия у вас. 22.4 минимальная
-
А как понять в какой версии был релиз?
-
-
-
Всем привет!
Пытаюсь обойти то что в toTimezone используется константа в часовом поясе
multiIf(
time_zone_code = 'Europe/Moscow', toTimezone(utc_dttm, 'Europe/Moscow'),
time_zone_code = 'Asia/Yekaterinburg', toTimezone(utc_dttm, 'Asia/Yekaterinburg'),
time_zone_code = 'Europe/Samara', toTimezone(utc_dttm, 'Europe/Samara'),
utc_dttm
) as lcl_dttm
но всё равно выдаёт московскую зону ) как мне в одном столбце поиметь разные часовые пояса? -
Разложить по разным столбцам ?
-
Думал сегодня об этом же. Пока в голове - создать словарь по ключу timezone_name, а в значение положить офсет в секундах
-
Вариант, но это плохо работает если таймзона меняет свой оффсет. А они меняют
-
-
пугающе много столбцов
-
Создать range key в словаре и проверять вхождение времени в интервалы летнего/зимнего времени
-
-
-
-
кластер левый, надо перекинуть данные
сетевая доступность до 9000 порта есть -
WITH
toDateTime('2022-01-01 00:00:00','UTC') as utc_dttm,
'Europe/Moscow' as time_zone_code
SELECT multiIf(
time_zone_code = 'Europe/Moscow', timeZoneOffset(toTimeZone(now(), 'Europe/Moscow')),
time_zone_code = 'Asia/Yekaterinburg', timeZoneOffset(toTimeZone(now(), 'Asia/Yekaterinburg')),
time_zone_code = 'Europe/Berlin', timeZoneOffset(toTimeZone(now(), 'Europe/Berlin')),
0
) as lcl_offset, utc_dttm + INTERVAL lcl_offset SECOND as lcl_dttm -
ReplicatedMergeTree?
-
Нет, именно движок баз данных
-
Он экспериментальный, но думаю его допилят. (им clickhouse.cloud в своем облаке пользуется)
-
хм, интересно, было бы вообще конечно удобнее если бы просто метаданные CH переодически дампил в S3
-
Есть план сделать shared metadata сторадж, причем в опен сорс роадмапе, но без каких либо сроков
-
да я даже issue про это видел да 🙁
-
-
-
У вас так и не работает remote ?
-
а как он заработает? нигде нет никакого описания как сделать чтоб он заработал кроме как обращаться к серверам кластера
-
remote работает не только с серверами в рамках кластера
-
отлично, как это сделать?
-
-
-
До друг друга могут ходить ?
-
-
-
-
-
-
-
-
Он ошибку выдает или весит вечно ?
-
-
-
-
-
-
-
Дак может нету такой таблицы ?
-
-
Попробуйте к system.parts например
-
-
В issue напишите, чтобы более понятную ошибку сделали
-
-
-
К сожалению ничего нового там для себя не нашел.
-
Даже то что в настройки передаются фильтры и клик их сам применяет ?
-
Я пока не вижу , ккк я могу увеличить скорость
-
ну не так прям напрямую )
нужно что-то в стиле:
SELECT count(success)
FROM directed.linear
WHERE (t_stamp > $__fromTime)
AND (t_stamp <= $__toTime)
AND success = '1'
AND date >= toDate($_fromTime)
AND date < date_add(DAY, 1, toDate($__toTime))
но чтобы такие костыли не творить, надо таблицу переделывать / допиливать ) - 08 November 2022 (137 messages)
-
Принял . Таблица унаследовала дерьмо с пошлой базы , сгоревшей вместе с датацентром :))))
-
"дерьмо с пошлой базы" :))
-
Выбить в граните
-
Есть способы быстро получать последнюю запись? Не делая каждый раз сорт
-
Коллеги добрый день!
Подскажите пожалуйста как реализовать в коде запрос, так что если условие выполняется то берётся одна таблица, а если нет то другая.
Что-то не вышло в лоб нагуглить, но хочется получить что-то вроде
SELECT
if(foo = bar, table1, table2) -
-
Это для дашборда, из Redash фильтр пробрасывается.
-
Но мне кажется я нашёл обходной путь, сделал UNION двух таблиц и перенёс фильтрацию по условию в секцию WHERE
-
Добрый день, коллеги! Решил тут попробовал lightweight delete. Не работает. Это баг или фича? https://pastila.nl/?0021c8f8/060207d4fa6b663d20f7fff8d9d7bf73
-
А какой движок у таблицы?
-
-
привет! делаю инсерт селекта из таблицы, в которой есть полностью одинаковые строки, а Кликхаус каждый раз срезает какое-то количество из дублирующихся строк, т.е. в итоге вставляет меньше строк, чем было в таблице-источнике. подскажите, пожалуйста, так может быть, я не ошибся с интерпретацией?
-
какой движок у таблицы-destination?
-
replacing - не подумал про такое, спасибо за подсказку
-
Опмтимизировал запросы из графаны к базе и проработал индексы. Можно проверить скорость обработки.
-
Классно, спасибо !
-
В итоге да помогло
-
-
Индекс date помогло организовать по итогу
-
Вcем привет!
Подскажите как правильно перенести данные из одной дисковой политики в другую?
у меня есть настроенный диск для горячих и холодных данных и есть диск который по умолчанию был.. как мне из default перенести все данные в disk_1 и то что не влезет по политике перенеслось в disk_2?
default,/1mnttmp/clickhouse/
disk_1,/ssd/clickhouse_hot_data/
disk_2,/DB/clickhouse_cold/ -
Подскажите, какой движок выбрать для таблицы, если я считаю в ней всего два агрегата? То есть нет какого-либо dimension, просто два числа получаются
-
Summingmt? Придется сделать доп поле с materialized 1 и сделать orderby по этому полю
-
Что-то вроде такого?
CREATE MATERIALIZED VIEW table_mv
ENGINE = SummingMergeTree() POPULATE
AS
select 1 as temp_col
sum(a) as users_with_conv,
sum(b) as users_without_conv
from table1
order by temp_col; -
Нет
Вот так
CREATE MATERIALIZED VIEW table_mv
ENGINE = SummingMergeTree() order by temp_col POPULATE
AS
select 1 as temp_col
sum(a) as users_with_conv,
sum(b) as users_without_conv
from table1
Group by temp_col
; -
-
Я понял! Спасибо большое!
Необычное чувство: час назад смотрел доклад по mv с вашим участием, а сейчас напрямую получаю ответ от вас)) -
Всем привет, столкнулся со сложностью
Таблица содержит записи о товарах относящихся к заказу, полностью уникальных полей нет. Есть только идентификатор заказа к которому относятся много товаров.
Задача состоит в том чтобы данные в таблице могли обновляться на произвольную глубину, т.е. у некоторых товаров изменился статус, это пришло с бэкенда - и это нужно заменить в таблице. Как я понимаю Replacing и его модификации тут не очень подходят из-за того что может быть множество полей с одинаковыми ключами, и заменить множество полей на множество не получится.
Как эту задачу адекватнее всего решить в кликхаусе? -
))
-
И сколько товаров всего? Похоже нужен словарь с товарами. И в таблице хранить Id заказа и Id товара
-
id и заказа и товара уже есть в таблице, вариантов товаров порядка 70 тысяч артиклей
-
Добрый день!
Чет туплю капец, не понимаю ошибку
Делаю concat() двух столбцов (Оба INT)
Получаю Code: 44. DB::Exception: Illegal column Const(UInt8) of argument of function concat. (ILLEGAL_COLUMN) (version 22.6.9.11 (official build))
в чем причина? Пробовал CAST делать и тд .. не могу в CH 2 столбца склеить)) -
Может проблема в том, что concat ждёт строки, а вы int даете ?
-
Ну в ошибке так и написано)) Но внутри concat он cast сделать не может
Надо обязательно до? -
-
Осилил, чет запара была тупейшая)
-
Привет чат, подскажите пожалуйста как переписать запрос через < case when ... then ... > ?
Запрос такой:
select count(distinct card_id) as cards_count from stats.appointmentstats
Я хочу в одном запросе несколько distinct подсчётов засунуть:
select count(case when stat_type = ‘new' then distinct card_id end) as cards_count_new, count(case when stat_type = ‘old’ then distinct card_id end) as cards_count_old from stats.appointmentstats
Но так оно не работает: then distinct card_id end
Если просто then card_id end то всё работает, но я хочу distinct -
countDistinctIf ?
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/combinators/#-ifAggregate Function Combinators | ClickHouse DocsThe name of an aggregate function can have a suffix appended to it. This changes the way the aggregate function works.
-
Всем привет, новичок в CH, может кто-то подсказать как загрузить словарь? Создаю через createDictionary, инфу по нему смотрю через SELECT * from system.dictionaries. Есть возможность его как-то загрузить? Загружаю его с помощью обычного select'a и dictGet, может есть какой нибудь получше способ?
Словарь берет данные из таблицы -
о, спасибо!
-
-
uniqExactIf(card_id,stat_type='new')
-
спасибо, сейчас попробую
-
DB::Exception Aggregate function is found inside another aggregate function in query
-
Всем привет!
Мы решили попробовать storage_policy=hdfs для MergeTree таблиц
И столкнулись с проблемами:
Указали 1 директорию в HDFS для всех таблиц, но в этой директории быстро накопилось много маленьких файлов, так что HDFS падает с лимитом по файлам на папку
Сделали 100 директорий с load_balancing=round_robin и 100 volumes, но теперь ClickHouose пишет только в 1 директорию (самую первую), а также размер файлов все равно не увеличивается. Настройка move_factor в данном случае не поможет, так как у нас HDFS
В HDFS теперь 100 директорий, файлы кладутся только в 1 единственную директорию, каждый файл по 2KB
Но для каждой из 100 директорий когда-нибудь все равно настанет лимит на количество файлов
Вопросы:
1) Можно ли как-то настроить размер файлов в HDFS?
Или лимит файлов в директории, или лимит файлов по размру в директории?
min_bytes_for_wide_part настройку мы при загрузке в локальное хранилище не используем, и там все ок, все мерджится автоматически, есть ли смысл ее применять в MergeTree с storage_policy=hdfs?
2) Можно ли как-то указать шаблон пути в disk, чтобы ClickHouse клал по шаблону, а не по жестко заданным 100 директориям которые могут однажды закончится? -
комбинаторы позволяют на ходу создавать новые функции
-
вот такой запрос SELECT count(uniqExactIf(card_id, stat_type = 'new'))
-
uniqExact уже возвращает count
-
оу..
-
действительно
-
спасибо большое)) проблема решилась
-
где там?
в CH есть функция countDistinct
при помощи комбинатора из нее можно сделать countDistinctIf
https://fiddle.clickhouse.com/165686d0-b32f-41c6-b9a4-db83fd0c1d11 -
попробуйте еще uniqIf он намного быстрее, но дает небольшую ошибку
-
да, вы правы
спасибо)) -
возьму на заметку) но я тут скоро финансы буду считать, ошибку мне не простят😅
-
а зачем?
словари загружаются лениво
это отключаемо
и есть system reload dictionary -
uniqExactIf vs uniqIf
765058 vs 762711
интересно, а почему он даёт ошибку? -
Приближенные вычисления потому что
-
потому алгоритм используется для приблизительных вычислений, на биг дата этот алгоритм использует памяти в 1000 раз меньше
https://en.wikipedia.org/wiki/HyperLogLogHyperLogLogHyperLogLog is an algorithm for the count-distinct problem, approximating the number of distinct elements in a multiset. Calculating the exact cardinality of the unique elements of a multiset requires an amount of memory proportional to the cardinality, which is impractical for very large data sets. Probabilistic cardinality estimators, such as the HyperLogLog algorithm, use significantly less memory than this, at the cost of obtaining only an approximation of the cardinality. The HyperLogLog algorithm is able to estimate cardinalities of > 109 with a typical accuracy (standard error) of 2%, using 1.5 kB of memory. HyperLogLog is an extension of the earlier LogLog algorithm, itself deriving from the 1984 Flajolet–Martin algorithm.
-
что-то вроде блум фильтров наверное
-
спасибо) почитаю
-
>но в этой директории быстро накопилось много маленьких файлов, так что HDFS падает с лимитом по файлам на папку
а что это за лимит такой? никогда не слышал, можете ссылкой поделится?
(естественно никаких папок в hdfs и s3 нету, там плоское хранение, все объекты в одной таблице, имена можно фильтровать по префиксу)
файлы мелкие скорее из партиционирования -
Всем привет!
Ребят, помогите пожалуйста с внешним словарем 🙂
Создаю внешний словарь на таблицу MariaDB (в которой ManyToMany связи), но количество строк в итоге в словаре меньше чем в исходной таблице.
Пробовал и SYSTEM RELOAD DICTIONARY, не помогло.
Пытался PrimaryKey при создании описать как конкатинацию полей, полученных из марии:
EXPRESSION concat(field_id, other_field_id)
Результат: Количество строк увеличилось, но все-еще не вся таблица.
Я так понимаю что PrimaryKey во внешних словарях должен быть уникальным, можете подсказать как его сгенерить на лету?
Спасибо! -
dfs.namenode.fs-limits.max-directory-items 0 Defines the maximum number of items that a directory may contain. A value of 0 will disable the check.
https://hadoop.apache.org/docs/r0.23.11/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
по умолчанию выключено -
ИЗ СЛОВАРЯ НЕЛЬЗЯ ЗАБИРАТЬ ДАННЫЕ SELECT-М. это очень медленно
PrimaryKey в словаре определяет как вы будете данные из словаря доставать при использовании dictGet , поэтому ваш вопрос не имеет смысла. -
1) dfs.namenode.fs-limits.max-directory-items
По умолчанию 1048576, у нас как раз столько файлов и оказалось после 1 дня заливки
2) То есть, я могу указать вместо этого:
<storage_configuration>
<disks>
<disk_name_1>
<path>/mnt/fast_ssd/clickhouse/dir_1</path>
</disk_name_1>
<disk_name_2>
<path>/mnt/hdd1/clickhouse/dir_2</path>
<keep_free_space_bytes>10485760</keep_free_space_bytes>
</disk_name_2>
Вот это
<storage_configuration>
<disks>
<disk_name_1>
<path>/mnt/fast_ssd/clickhouse/dir_*</path>
</disk_name_1>
? -
Привет, у кого есть опыт мульти-дата центрового примирения КХ? Какие особенности стоит учитывать при сетапе для высокой доступности? Для зукипера, как я понимаю, надо минимум 3 ДЦ, с минимальной latency между ними и нодами КХ.
-
тоесть вы предлагаете просто сделать PrimaryKey одно из полей?
повторюсь, так делал и данных в итоговом словаре получается критически мало. На одно уникальное значение PrimaryKey одно вхождение. -
Кажется что dfs.namenode.fs-limits.max-directory-items искусственное ограничение, оно убрано в современных hdfs
dfs.namenode.fs-limits.max-directory-items 0 Defines the maximum number of items that a directory may contain. A value of 0 will disable the check.
https://hadoop.apache.org/docs/r0.23.11/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
по умолчанию выключено -
partition by какой у таблицы?
-
сколько КМ (сколько летенси) между DC ?
-
вы говорите странное.
Словарь это способ достать значение по ключу. Вы рассказываете что у вас ключи повторяются, что несколько странно в разрезе K/V -
господа, скажите такое
если у меня mv с набором materialized полей, и я хочу на него навесить еще один mv
как мне кажется навскидку, вторая вьюха будет получать поля кроме материализованных, и для соответствия структур мне во второй view надо будет их задублировать (что приведет к повторному их вычислению)
прав ли я, и обходимое ли сие? -
-
Посмотрел, даже на master бранче у них дефолтовое значение 1 млн
Плюс, нельзя задать <= нуля, там Precondition, и нельзя задавать больше 64 млн, это хардкод ограничение
https://github.com/naver/hadoop/blob/master/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java#L285hadoop/FSDirectory.java at master · naver/hadoopPublic hadoop release repository. Contribute to naver/hadoop development by creating an account on GitHub.
-
У меня одна идея, может немного бредовая.
А есть ли возможность создать словарь так, чтоб по ключу доставать json поле или массив (где будут храниться все OneToMany связи). -
подскажите пожалуйста можно ли в CH одну таблицу партицировать и шардировать одновременно?
-
-
Спасибо! 👍
-
Вот пример одной из таблиц
-
-
Бредовая идея - это словарь с одинаковыми ключами разных строк. А вот сложная структура строк - вполне себе рабочая тема.
create dictionary test ( id UInt64, d1 Array(String), d2 Array(Map(String,UInt16)) ) ... -
Есть ли вариант создать mv, который бы обновлялся при джойне двух таблиц? Имеется ввиду по инсерту не только в левую таблицу, но и в правую?
-
Всем привет, вопрос по словарям, я заполняю таблицу из данных словаря, словарь нужно ли как-то заранее подгружать или можно просто сразу данные из него брать и он во время мутации подгрузится?
-
Привет! Есть у кого нибудь на примете толковая статья про Date / Datetime / TS? Когда ввожу дату хардкодом он делает от нее -3 часа, а когда выводит в интерфейс делает +3 часа. Когда преобразую datetime в date 2022-10-01 21:00:00 он преобразует его в 2022-10-02. Возникла небольшая путанница хочу разобраться.
-
Народ для CH кто какими балансерами пользовался? Какой лучше?
-
У DateTime под капотом UInt32 - число секунд от 1970-01-01 00:00:00 в UTC.
Таймзона влияет только на парсинг из строки в DateTime и при отображении значения. При парсинге используется либо таймзона сервера, либо таймзона клиента (в зависимости от настройки), так что во избежание неоднозначностей лучше всегда указывать её явным образом. -
Спасибо!
-
https://www.chproxy.org/ вот этим, для тех учетокLink
Chproxy is an HTTP proxy and load balancer for ClickHouse
-
Ну и если вам надо сконвертировать DateTime в Date, то тут таймзона тоже важна, ибо одно и то же время в разных таймзонах может быть разной датой. Так что тут совет тот же - указывайте таймзону явным образом.
-
Спасибо, разобрался!
-
Я бы сказал спам чистой воды
-
Можно сделать два MV (обязательно с TO). Но тут вопрос с самим джойном - вы сможете заставить его работать в обе стороны быстро?
-
Привет всем! Подскажите пожалуйста, может кто сталкивался: CH при использовании collation "en/en_US" считает что кириллические буквы "е" и "ё" одинаковые между собой. Можно ли как то заставить его их различать с помощью дефолтных механизмов?
-
-
можно
-
Она будет реплицироватся на все узлы? Можно ли ее потом шардировать?
-
будет ли схема реплицироваться?
-
Данные
-
-
-
-
-
Сами по себе инстансы кликхауса ничего не знаю о друг друге. Их связывает Zookeeper и Distributed таблицы в один так называемый кластер
-
Прокси-серверы от сторонних разработчиков | ClickHouse Docs
proksi-servery-ot-storonnikh-razrabotchikov}
-
Благодарю!
-
-
Арбитражные сигналы под %
Пишите в личку -
привет, запустил такой запрос
DROP TABLE IF EXISTS neru.logs_shard ON CLUSTER '{cluster}' NO DELAY;
такой ответ
Received exception from server (version 21.11.3):
Code: 159. DB::Exception: Received from localhost:9000. DB::Exception: Watching task /clickhouse/clickhouse/task_queue/ddl/query-0000000088 is executing longer than distributed_ddl_task_timeout (=180) seconds. There are 6 unfinished hosts (0 of them are currently active), they are going to execute the query in background. (TIMEOUT_EXCEEDED) -
SELECT
host_address,
port
FROM system.clusters
Query id: fa92527c-7212-408e-ba89-e5ed306efa3e
┌─host_address───┬─port─┐
│ 172.16.222.237 │ 9000 │
│ 172.16.9.122 │ 9000 │
│ 127.0.0.1 │ 9000 │
│ 172.16.9.125 │ 9000 │
│ 172.16.240.74 │ 9000 │
│ 172.16.9.127 │ 9000 │
│ 172.16.222.237 │ 9000 │
│ 172.16.9.122 │ 9000 │
│ 127.0.0.1 │ 9000 │
│ 172.16.9.125 │ 9000 │
│ 172.16.240.74 │ 9000 │
│ 172.16.9.127 │ 9000 │
│ 172.16.222.237 │ 9000 │
│ 172.16.9.122 │ 9000 │
│ 127.0.0.1 │ 9000 │
│ 172.16.9.125 │ 9000 │
│ 172.16.240.74 │ 9000 │
│ 172.16.9.127 │ 9000 │
│ 127.0.0.1 │ 9000 │
│ 127.0.0.2 │ 9000 │
│ 127.0.0.1 │ 9000 │
│ 127.0.0.2 │ 9000 │
│ ::1 │ 9000 │
│ ::1 │ 9000 │
│ ::1 │ 9000 │
│ ::1 │ 9440 │
│ ::1 │ 9000 │
│ ::1 │ 1 │
└────────────────┴──────┘ -
CollapsingMergeTree хороша если вы сверху на нее вешаете MV, которое аггрегирует данные (скорее даже суммирует). Это MV тоже получит дубликаты, и чтобы аггрегаты были правильные надо делать вычитание "удаляемых" строк. Вот ради этого и придумана вся эта чехарда с sign=-1. Только есть вопрос - у вас есть под руками источник "предыдущих" значений?
Если же у вас одинокая табличка и надо по простому удалять дубликаты - берите ReplacingMT/final со всеми последними оптимизациями типа do_not_merge_across_partitions_select_final -
Привет! Пытаюсь написать запрос, который будет считать MAU для каждого дня (относительно 30 предыдущих дней). Нашла только одну старую статью на stackoverflow:
https://stackoverflow.com/questions/55932717/monthly-active-users-in-clickhouse
Сейчас в clickhouse уже есть with.
Пишу следующий запрос:
with date_ranges as(
select distinct event_date as my_date from events
WHERE event_date >= '{{ start_date }}'
AND event_date <= '{{ end_date }}'
)
SELECT date_ranges.my_date,
(SELECT uniqExact(user_id)
FROM (select * FROM events
WHERE ...
AND event_date >= toDate('{{ start_date }}') - INTERVAL 30 day
AND event_date <= '{{ end_date }}'
) as events
WHERE events.event_date BETWEEN date_ranges.my_date-30 AND date_ranges.my_date) AS mau
from date_ranges
Выдает ошибку Missing columns: 'date_ranges.my_date'.
Подскажите, как решить такую задачу?Monthly active users in ClickHouseSince ClickHouse doesn't support WITH clause for queries, I'm having troubles implementing a query for calculating MAU (Monthly active users calculated day by day and the 30 days range is moving da...
-
В between нельзя обратиться к date_ranges, так как это по сути подзапрос. Попробуйте перенести where в самый конец
-
Тогда смысл другой становится. И date_ranges вообще нигде не определен тогда
-
за каждый день есть
-
вы бы сделали поиск по чату. недавно обсуждалось и реализовывалось вполне себе в виде clickhouse-way with uniqState/uniqMerge
-
WITH events AS
(
SELECT
toDate(number % 90) AS date,
number % 4 AS user_id
FROM numbers(180)
ORDER BY
date ASC,
user_id ASC
)
SELECT DISTINCT
date,
countDistinct(user_id) OVER (ORDER BY date ASC RANGE BETWEEN 30 PRECEDING AND CURRENT ROW) AS mau
FROM events
ORDER BY date ASC -
-
пример для 3 дней
https://fiddle.clickhouse.com/27419634-e675-4631-90d2-744e7447fa85 -
собственно, да, это модификация запроса, который, как тут заметили, некоторое время назад тут обсуждался )
-
Спасибо большое.
Воспользуюсь вашим советом. -
круто кстати. в 30 раз быстрее чем мой вариант, надо взять на заметку
-
The projection does not allow to execute query · Issue #40512 · ClickHouse/ClickHouse
Describe what's wrong When the allow_experimental_projection_optimization function is enabled, it is not possible to execute a query. The following is an example that will accurately reprod...
-
-
-
всем привет
ни как не могу найти в доках, есть ли какой-то способ замерить размер строки в байтах при вставке или селекте ? -
and length(action) < 20
-
мне нужен размер в байтах всех столбцов в строке которые вставляются или селектятся
-
у меня обработка через материализацию ... и в теории при селекте в материализации мне нужно посчитать размер строки и записать или как-то при инсерте
-
-
ооо .... буду копать .... снкс
-
то что нужно !! большое спасибо !
-
Подскажите, пожалуйста, какие есть варианты смигрировать данные в уже существующую таблицу клика? Добавили новую колонку в таблицу и теперь требуется исторические записи по этой колонке апдейтнуть. Движок таблицы replacingmergetree, могу в теории кидать те же запись кусками с обновленным значением, но может ещё варианты есть (типа alter table update where id in и длинные списки айдишек добавлять)
-
-
Дмитрий, спасибо большущее!
-
Набираю людей в команду по арбитражу , лс
-
Добрый вечер, есть ли способ скачать конкретную версию ClickHouse binary под MacOS? (curl https://clickhouse.com скачивает последнюю)Fast Open-Source OLAP DBMS - ClickHouse
ClickHouse is a fast open-source column-oriented database management system that allows generating analytical data reports in real-time using SQL queries
-
Добрый, в каких логах модно мониторить работу матьвью? У меня таблица пишет в null а на неё натравлена матвью для загрузки в целевую. Заранее спасибо
- 09 November 2022 (192 messages)
-
Нужны люди для открытия или у кого есть ООО или ИП и сдачи его в аренду, приносит от 60 - 150 тысяч в месяц. Требования граждане РФ .
По всем вопросам: @Wladimirmir -
Что значит мониторить? system.part_log неплоха для понимания что там происходит при вставках.
-
Спасибо! Понимать что она работает.
-
-
aioch вроде так называется, но можно просто http запросы слать и все
-
Для "редких агрегационных запросов" из python http это ок.
-
Так понимаю, что видимо для hdfs политики ещё слишком сырые наработки?
Нам главное понимать, да-нет, чтобы понимать как действовать в дальнейшем
В любом случае, благодарю за ответ! -
Всем, привет! Вопрос по установке параметра max_expanded_ast_elements. Могу установить его через SET, но ни через конфиг, ни через строку подключения этот параметр никак не меняется.
Создал файл /etc/clickhouse-server/users.d/query.settings.xml с содержимым:
<?xml version="1.0"?>
<yandex>
<profiles>
<default>
<max_expanded_ast_elements>1500000</max_expanded_ast_elements>
</default>
</profiles>
</yandex>
Ничего не подхватывается и не меняется. Перезапуск сервера не помогает. Версия 22.10.2.11
Что я делаю не так? -
вы создайте лучше гитхаб ишью, иначе разработчики КХ не узнают об этом
-
query_view_log ?
-
2022.11.09 09:26:26.454839 [ 1 ] {} <Error> Application: DB::Exception: Either 'password' or 'password_sha256_hex' or 'password_double_sha1_hex' or 'no_password' or 'ldap' or 'kerberos' or 'ssl_certificates' must be specified for user clickhouse_operator.: while parsing user 'clickhouse_operator' in users configuration file: while loading configuration file '/etc/clickhouse-server/users.xml'
Подскажите, может кто сталкивался с такой проблемой в clickhouse-operator, как правильно это исправить? -
Здравствуйте.
запрос
SELECT [] as arr,
multiIf(
empty(arr),
0,
arrayElement(arr, -1)
)
;
возвращает ошибку Cannot create non-empty column with type Nothing: ...
short_circuit_function_evaluation в настройках = enable
версия 22.8.8.3
подскадите куда копать ?
на версии 22.3.13.80 ошибки нет -
Коллеги подскажите как у clickhouse с подиском текста в текстовых полях? может есть где почитать или сравнить его с elastic?
-
Добрый день,
Хотел вернуться к вашему примеру:
Каким образом можно сделать так, чтобы временной бакет начинался и заканчивался относительно аргументов в Where?
toStartOfInterval(?, interval 1 week) может "передвинуть" начало бакета к ближайшему понедельнику, в то время как ~"timeFrom" в Where может относиться ко вторнику, четвергу или любому другому дню недели.
В примере вы используете number() для генерации случайных чисел и today() для старта недельного бакета с текущего дня.
Имеет смысл использовать конструкцию with ? (with timeFrom, timeTo ) и уже в последствии использовать переменные как для подсчета точки отсчета бакета, так и в качестве аргументов для конструкции where time between timeFrom and timeTo?
Не нашел адекватных примеров в сети или в документации -
У вас вопрос некорректный, а что с ним ? Ну хотите сделайте, я не эксперт в поиске, ну есть какие то нграммы и т.д. Кто то пытался делать поиск на Clickhouse, есть в интернете статьи
-
-
ClickHouse vs. Elasticsearch
This article describes the advantages and disadvantages of ClickHouse and Elasticsearch by analyzing their kernel architectures.
-
-
Во. Спасибо!!
-
нельзя сравнить с эластиком. Тут пока конструктор сделай сам. Основные варианты из старых - ngram skip индекс или же обратный индекс в виде отдельной таблички. Придется сделать свой токенизатор, а так-же выбрать и применить тот или иной леммаризатор.
В последней версии КХ появился векторный поиск. Наверное его тоже можно применить для полнотекста. Ну или дождаться пока команда разработчиков соберет все запчасти в прекрасную C++ функцию доступную в SQL.
Тогда можно будет сравнить с эластиком и прочими. Мне издалека нравится мантикора (в проде не запускал, но на тестах весьма неплоха). -
Привет! Видел в каком-то из докладов Алексея Миловидова, что они реализовали фичу позволяющую делать вставку в MergeeTree маленькими и частыми батчами. Там под капотом оно собирается в большой буфер и только потом уже фактически вставляется в КХ
Может, кто с ходу подскажет в какой версии это было, что бы почитать ченж лог, бо я пока не нахожу. Или любая другая инфа об этой фиче -
ищите в доке async insert и в change log тоже. Все там есть
-
А, оно так называется. Спасибо)
-
нда непростой выбор. у меня просто есть поиск по 5-10млн записей и некоторые поля именно текст (там фамилии) и таких полней не очень много. но поиск по ним тяжеловат. сейчас mvp на es справляется но мне непонятно как будет кх
-
5-10M - немного. Попробуйте bloom_filter skip index. Возможно стоит разбить предложения на токены и хранить как словарь
-
Всем привет!
Подскажите, можно ли как-то переименовать поля после применения APPLY или задать шаблон необходимого мне переименования?
SELECT * APPLY(sum)
FROM (
SELECT * FROM VALUES ((1,2,3), (2,3,4), (3,4,5))
)
в примере получаются имена sum(c1), sum(c2), sum(c3), а, допустим, я бы хотел с1_sum, c2_sum, c3_sum -
спасибо попробую
-
у меня получалось только по номерам позиции в туплах. Типа такого - SELECT (tuple(* APPLY(sum)) as t).1 as с1_sum, t.2 as с2_sum.... но может кто знает что-то получше.
-
угу, значит, хотя бы это переименованию поддается, спасибо, Борис!
Но да, если кто-то знает как это сделать автоматом, было бы здорово -
Подскажите, где можно почитать с примерами, как делать агрегаты в КХ?
-
Вопрос, наверное, дурацкий, но я не знаю, как правильно задать. Есть таблица, которая хранится год, а мне нужно делать сравнительный анализ по ней год к году и говорят, что для этого нужно делать агрегаты. Вот про них вопрос, это что? Как в документации набрать запрос, чтобы начать изучение вопроса
-
В блоге Альтинити ищите materialized view
-
Кстати, хотел спросить, а вы консалтинг предоставляете проектный?
-
Благодарю
-
нет. Оплачиваете годовой саппорт на разработку или поддержку и получаете полный доступ, неограниченное кол-во митингов / консультаций / слак с моментальными ответами 24*7
(из России конечно деньги не принимаем) -
-
-
-
да копейки на самом деле
-
А где можно поточнее в копейках сориентироваться? :)
-
скажем все начинается за сумму (год) меньше чем ваша годовая зарплата
поддержка разработки, без поддержки серверов (emergency починок в zoom) -
-
вы думаете что я продаван что-ли?
сумма разная для каждого клиента, зависит от ваших аппетитов.
ну давайте я назову $25.000 в год, а потом вы сторуетесь на $10.000 или на $500.000 -
Нет, почему? Но общий порядок цен "средний по больнице" обычно сотрудники компании знают)
-
-
есть 2 типа поддержки они отличаются по цене в 10 раз.
-
create dictionary ab.dict_test_variants_of_last_2_years (
test_variant String
)
primary key test_variant
source (CLICKHOUSE(
HOST hostName()
PORT tcpPort()
USER :username
PASSWORD :password
DATABASE 'ab'
TABLE 'view_test_variants_of_last_2_years'
))
layout(COMPLEX_KEY_HASHED())
lifetime(MIN 3000 MAX 4000);
Создаю словарь по вью чтоб кешировать запрос
Во вью даные есть в словаре нет
select * from ab.view_test_variants_of_last_2_years;--Показывает данные
select * from ab.dict_test_variants_of_last_2_years;--НЕ показывает данные
Каких прав не хватает? -
а словарь то заполнен?
-
system reload dictionary ab.dict_test_variants_of_last_2_years
-
Интервал обновления для полностью загружаемых словарей и интервал инвалидации для кэшируемых словарей определяется в теге <lifetime> в секундах. То есть первое наполнение автоматом произойдет через 50 минут только, если reload не сделать вручную
-
Подскажите пожалуйста по работе ReplacingMergeTree
Убираю дубли с помощью OPTIMIZE TABLE schema.table FINAL DEDUPLICATE
У меня есть таблица в CH условно с 1 января по 10 ноября с данными которые вставляю из mysql, я ей делаю optimaze, потом закидываю те же данные с MySQL только с 7 по 10 ноября (получилось 4 дня с дублями) и когда делаю еще раз optimaze он мне схлопывает строки не только по этим 4 дням а по всему году. Хотя по логике должен сжать только эти 4 дня.
Может еще есть какой нибудь подход чтобы решить поставленную задачу?
Надо из MySQL переливать данные в CH исключая дубли, включая те строки которые уже есть в CH -
Делать оптимайз по партициям
-
Не уверен, что получится, в таблице нет партиций и дат как таковых, там надо собирать уникальные связки пользователей
-
Спасибо, радует
-
А что по полям order by? Схлопывание идет по ним, как по кортежу уникальных данных. Похоже, там маловато полей и данные схлопываются.
-
https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replacingmergetree/
Движок отличается от MergeTree тем, что выполняет удаление дублирующихся записей с одинаковым значением ключа сортировки (секция ORDER BY, не PRIMARY KEY).ReplacingMergeTree | ClickHouse Docsreplacingmergetree}
-
Видимо да, из 3 ключевых полей parent_id, child_id, action только по parent_id есть order by
-
ну вот и ответ )
-
а как вы определяете, что движок опять схлопнул данные за 1-6 ноября, если 1) там уже были данные схлопнутые и 2) вы туда новых данных не заливали?
-
Спасибо!
-
Делаю select dt, count(*) group by dt
И примерно за 2 месяца данные схлопываются (уменьшается count), хотя я ожидаю схлопку только за 4 дня -
Коллеги, привет! Столкнулся с проблемой при попытке удалить ошибочно созданную таблицу из кликхаус кипера. При попытке удаления "SYSTEM DROP REPLICA 'имяреплики' FROM ZKPATH 'clickhouse/tables/01/logs/имятаблицы';" получил ошибку Code: 999. DB::Exception: Received from localhost:9000. DB::Exception: Session expired, path: clickhouse/tables/01/logs/имятаблицы/replicas. (KEEPER_EXCEPTION). Но интереснее другое, то что при этом у меня в фоне в replicatedmergetree таблицы наливались данные и они поотваливались с ошибками как на скрине. Это вообще нормальное поведение?
-
подскажите пожалуйста в чем может быть дело:
словарь с внешним источником возвращает пустоту https://fiddle.clickhouse.com/738c9658-20e4-42ce-9e4d-5de904950489
при этом в этой версии сервера результат непустой https://fiddle.clickhouse.com/c5c26d7b-eee3-4fd1-a90c-a4b9ebb414e7
в changelog что то не нахожу по этому поводу информации -
и отдельный вопрос что прилетит в реплики, которые я планирую добавить позже в таком кейсе. Для восставновления данных я дропнул партиции и наливаю куски данных соответствюущих месяцев заново
-
Народ, привет, может кто подсказать, что тут вообще происходит / как читать подобный лог (отформатировал максимально читаемо)
-
22.1.4 плохая версия, и в начале года были проблемы с багами
-
ну у нас вообще 21.12.3.32 на ней такой же результат, путем перебора выяснил что словарь начинает работать как надо начиная с версии 22.2
-
system.query_log должно чуть больше сказать
-
какую версию посоветуете :))
-
22.3 хотя бы или 22.8
-
If you specify DEDUPLICATE, then completely identical rows (unless by-clause is specified) will be deduplicated (all columns are compared), it makes sense only for the MergeTree engine.
И вобще эта задача "из MySQL переливать данные в CH исключая дубли, включая те строки которые уже есть в CH" конечно же не решается через optimize. Optimize - это сервисная процедура, чтобы место почистить. Ни для чего другого ее использовать не стоит.
Хорошая статья на алтинити - https://kb.altinity.com/altinity-kb-schema-design/row-level-deduplication/
Если не хочется использовать final и при этом не очень все наворочено (меньше миллиарда в строк в час и без кластеров), то возможно вам будет интересен вариант 6.ClickHouse row-level deduplicationClickHouse row-level deduplication.
-
22,8 - криво работают окна, точнее не работают, на 22.10 вроде полет нормальный
-
А есть issue почитать про проблемы с окнами в 22.8?
-
1
-
Спасибо!
-
а 22.10.1.1877 норм версия?
-
решаем до какой версии обновляться и хотелось бы не напороться на известные проблемы если они есть
-
Не стоит
-
Broken compatibility between 22.8.5.29 and 22.8.6.71 · Issue #42916 · ClickHouse/ClickHouse
Steps to reproduce: Setup a DB with 22.8.5.29. Create an argMax state with a string of 32 chars. (any size seems to be affected) Update to 22.8.6.71. Select argMaxMerge of that status. An extra NUL...
-
Коллеги, удалил около четверти размера БД с помощью delete на основной таблице, место на диске всё еще занято, и уменьшается от текущих инсертов с обычной скоростью, репортит мне df уже несколько часов. Что предпринять чтобы не вылететь по нет места на диске?
-
У вас там случаем бекапов нет на диске?
-
отдельный партишн для базы, больше ничо там нет
-
-
Создаю таблицы консюмеры для Nats. Каждый консюмер кушает cpu на 100%.
Версия 22.10.2 revision 54460
Что можно с этим сделать? -
а мутация delete выполнилась?
-
ща проверю
-
не, висят
-
чота долго
-
parts_to_do не уменьшается
-
вот ^^^
-
Вопрос, очень много много таблиц и партов.
тормозит ЗК.
помимо https://github.com/ClickHouse/ClickHouse/issues/31919#issuecomment-980700553
что ещё можно покрутить?
на данный момент даже select * from system.replicas убивает ЗК надолго и очень долго отрабатывает (не дождались)....Zookeeper & 5000 Replicated tables · Issue #31919 · ClickHouse/ClickHouseIt's not an issue just an observation. 1 replica create database test_zoo; -- Let's create 5000 tables for i in `seq 5000`; do echo -n $i ""; \ clickhouse-client -...
-
Извините за любопытство (не совсем праздное)
1. "много" - это сколько?
2. много партов из-за партиций, это такой сознательный выбор, или дело в чем-то другом?
3. clickhouse-keeper не пробовали? -
1. тыс 20
2. сознательный выбор
3. нет, пока сложно оттестировать с данными и партами. (если у вас есть бенчмарк, поделитесь плз) -
Привет всем! Подскажите пожалуйста, может кто то сталкивался. Как я понял, CH использует для сортировки либу ICU, можно ли как то заставить его использовать LIBC?
-
Всем привет,
как можно быстро скопировать данные с одного сервера на другой при условии, что в новом сервере больше дисков? INSERT INTO SELECT занимает неделю, хочется как-то быстрее. на старом сервере 1 диск, на новом 7. может у кого-то скрипт есть какой -
Спасибо.
Вроде 20 тыс не так и много ...
Бенчмарка нет, я как-то даже не думал, если честно. -
Лучше этот вопрос задайте через Issue на github'e
-
на всякий случай: думаю человек ответил про число таблиц, а не партов
-
1. clickhouse-copier
2. если таблица реплицированная, добавьте реплику. Если не реплицированная, сначала сделайте реплицированной. [На самом деле, я так никогда не делал, но вроде должно работать] -
Что такое LIBC? Стандартная библиотека?
-
1. a clickhouse-copier разве не insert select делает?
2. идея интересная. попробую -
у вас реплицированные? там после 2-3 тыс запросы в system.replicas уже не торт...
-
20 тыс чего? Таблиц?
Тогда много, да.
В оригинале было "много много таблиц и партов", я понял, что это общее число партов. -
ReplicatedMT парты копирует целиком по командам из ZK. Без декомпрессии/компрессии. copier на самом деле делает тоже самое, но используя свой конфиг для понимания что куда. Так что если у вас не 100 нод, то присоединяюсь к предыдущему оратору - просто сделайте реплику.
-
Библиотека сравнения/сортировки строк в юникоде, если не путаю
-
Думаю, что путаете. Это было бы странным именем для библиотеки.
С другой стороны, glibc конечно же содержит некоторые функции для collation. -
сделал как советовали данные льет, спасибо большое! еще бы понять почему так медленно, сетевой интерфейс показывает 50-70mbit/s, хотя оба кластера в одном k8s, соседние namespace
-
Not enough idle threads to apply mutations at the moment. See settings 'number_of_free_entries_in_pool_to_execute_mutation' and 'background_pool_size'
-
если эти колонки не запрашивать все ок.
-- log_max_index,
-- log_pointer,
-- last_queue_update,
-- absolute_delay,
-- total_replicas,
-- active_replicas,
-- last_queue_update_exception,
-- zookeeper_exception,
-- replica_is_active,
в документации об этом есть, но не все колонки указаны...
но если есть ещё где крутить было бы неплохо -
где прописать настройку number_of_free_entries_in_pool_to_execute_mutation ?
-
при этом background_pool_size написано что obsolete, но упоминается в ошибке
-
Not enough idle threads to apply mutations at the moment. See settings 'number_of_free_entries_in_pool_to_execute_mutation' and 'background_pool_size'
>>> select from settings etc:
number_of_free_entries_in_pool_to_execute_mutation │ 5
background_pool_size │ 32 -
все мутации прошли, а места нет и нет.
-
-
0 lines
-
-
я снял всю нагрузку, все инсерты. С инсертами оно вообще стояло на месте с мутациями, несмотря на настройки выше. НО сейчас оно шото делает с s3 bucket, который я подключил, а именно, мёржит его, суда по логам. Также пишет что удаляет какие-то парты не с S3, а с filesystem, но на свободном месте оно не отражается.
-
чем занято место можно посмотреть:
попереключайте active = 1 , active = 0
SELECT
database,
table,
formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed,
formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed,
round(usize / size, 2) AS compr_rate,
sum(rows) AS rows,
count() AS part_count
FROM system.parts
WHERE (active = 1) AND (database LIKE '%') AND (table LIKE '%')
GROUP BY
database,
table
ORDER BY size DESC; -
единственно что я могу предположить, все треды были заняты s3, потому что оно, натурально, тормозит
-
пишет что всё активное, всё занято
-
занято чем? system таблицами?
-
у меня одна таблица, там ts на третьем уровне индекса. Занимает 2 месяца. Я удалил 15 дней.
-
ключей 1 и 2 уровня УМЕРЕННО
-
ни слова не понятно. Место занято вашей таблицей, ОК. Причем тут ts и что за уровни еще?
-
можно копировать rsync-м
-
место занято моей таблицей, там order by (key1, key2, ts)
-
удалил 19 billion records, осталось 29 billion
-
место не освободилось.
-
удалял where ts between (... 15 days of 45 days ... )
-
значит что-то не так. Либо не удалилось, либо неактивные парты есть, либо у вас в shadow лежит бекап
-
что такое shadow, и что такое бэкап?
-
(кроме меня этот инстанс никто не трогал)
-
/var/lib/clickhouse/shadow
alter table ... freeze -
нету
-
в /var/lib/clickhouse/data/база/таблица/detached что-нибудь есть?
если смотреть мой запрос размер таблицы из system.parts совпадает с тем что df -h показывает? -
да, совпадает
-
(я и написал что пишут вся активная)
-
а оно точно удалилось?
-
да, count сильно поредел
-
делаю селект count(), min(ts), max(ts), сканирует СТАРЫЙ РАЗМЕР записей, то есть 44, возвращает каунт 29
-
ну смотрите по партициям
SELECT
database,
table,
partition,
formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed,
formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed,
round(usize / size, 2) AS compr_rate,
sum(rows) AS rows,
count() AS part_count
FROM system.parts
WHERE (active = 1) AND (database LIKE '%') AND (table LIKE '%')
GROUP BY
database,
table,
partition
ORDER BY size DESC; -
processed 54 billion records
-
хороший запрос, спасибо
-
обождите а вы удяляли delete ? или alter table .. delete ?
-
delete
-
хахаха, delete не удаляет, просто помечает что удалено
-
а написано было что оно потом удалится
-
я понимаю про псевдо-колонку итд
-
потом, при мержах, когда-нибудь или никогда
-
плохо дело.
-
это вообще highly experimental, ломает таблицы направо и налево
-
ну в whats new было подано с помпою.
-
окей, будем потихоньку ковырять дальше
-
спасибо
-
known issues / limitations of lightweight deletes · Issue #39870 · ClickHouse/ClickHouse
they will be delayed, then there are a lot of merges happening (=when there is a high inserts pressure, and the pool is busy) they 'touch' all the parts - so if the list of parts is...
-
ну слава богу, а то я думал шо совсем пц
-
щас вот например инсертов нет, но ковырёж в s3, наверное все треды этим заняты и до filesystem руки не дошли, не знаю.
-
А МОГЛИ БЫ
-
подскажите, пжл, делаю INSERT в дистрибьютед таблицу - успешно, делают потом поиск по этой таблице - 0 записей
INSERT INTO `events` (`id`,`event_type`,`details`,`api_account_id`,`api_application_id`,`session_id`,`instance_id`,`source_id`,`source_type`,`timestamp`) VALUES ('237f9221-bcee-4981-9ce8-8f95374d10db','session_destroy','{"field": "value2"}','59e69cd7','3e91b9a2-c50f-4583-8c44-1e26a86cc1b0','b194ba04-774d-464a-b831-ff7016e74d56','','client-persistence-api','service','2021-02-05 13:15:30');
INSERT INTO events (id, event_type, details, api_account_id, api_application_id, session_id, instance_id, source_id, source_type, timestamp) FORMAT Values
Query id: fed81219-d92a-47da-b4ec-aca028e9388c
Ok.
1 rows in set. Elapsed: 0.002 sec.
chi-clickhouse-neru-cluster-shard1-0-0.chi-clickhouse-neru-cluster-shard1-0.clickhouse.svc.cluster.local 🙂 select * from neru.events;
SELECT *
FROM neru.events
Query id: e6cae5a3-b917-4b6b-9f79-e8a03304f717
Ok.
0 rows in set. Elapsed: 0.006 sec. -
select * from system.distribution_queue
-
SELECT *
FROM system.distribution_queue
Query id: d004dcec-de2a-4607-86a4-aa8b741cf73a
┌─database─┬─table──┬─data_path─────────────────────────────────────────────────┬─is_blocked─┬─error_count─┬─data_files─┬─data_compressed_bytes─┬─broken_data_files─┬─broken_data_compressed_bytes─┬─last_exception─┐
│ neru │ events │ /var/lib/clickhouse/data/neru/events/shard2_all_replicas/ │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ │
│ neru │ events │ /var/lib/clickhouse/data/neru/events/shard3_all_replicas/ │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ │
└──────────┴────────┴───────────────────────────────────────────────────────────┴────────────┴─────────────┴────────────┴───────────────────────┴───────────────────┴──────────────────────────────┴────────────────┘
2 rows in set. Elapsed: 0.001 sec. -
вариантов много:
записи удаляются TTL: 2021-02-05
зависают в дистрибьютед
insert_deduplicate
row policy (читающий не имеет прав видеть записи) -
🤦♂️ точно, TTL, спасибо большое
-
Привет! Я тоже про Distributed таблицы. Насколько вообще нормальная практика вставлять все данные в Distributed на кластере, например, в 4 шарда по 2 реплики с довольно большим потоком вставляемых данных, которые заранее собираются в небольшие батчи? Как лучше всего отслеживать, что такая схема плохо работает, данные при пересылках через Distributed застревают/теряются? Видел только что-то вроде DistributedConnectionFailTry, DistributedConnectionFailAtAll в system.events, но тяжело по ним что-то понять. И правда ли, что при большой нагрузке в моменте можно потерять данные?
-
rule of thumb - при большой нагрузке надо вставлять строго в Replicated-таблицы
-
где допустимо/нужно - через Buffer
-
А при вставке в буфер тоже возможны редкие потери данных? Или только зависнуть там могут?
-
Да
-
читайте доку.
buffer хранит в памяти, если КХ упадет (или убит OOM) или если железка рестартует, буффер потерян, если КХ не сможет остановится и убьется, уффер потерян. -
-
-
-
-
-
Привет! Подскажите плз, как трактовать ну или описать значения вот этих параметров в query_log
sum(ProfileEvents.Values[indexOf(ProfileEvents.Names, 'RealTimeMicroseconds')]) / 1000000 AS RealTime,
sum(ProfileEvents.Values[indexOf(ProfileEvents.Names, 'UserTimeMicroseconds')]) / 1000000 AS UserTime,
sum(ProfileEvents.Values[indexOf(ProfileEvents.Names, 'SystemTimeMicroseconds')]) / 1000000 AS SystemTime -
Обычно не теряются. Т.е. могут застрять там потому что поле добавили или удалили в неправильном порядке. Это можно мониторить через system.distribution_queue
-
-
Да как обычно. Realtime это стеновое walltime. Usertime это процессорное время в юзерспейсе. Systemtime процессорное время в ядре
-
ок, спасибо
-
Доброго времени суток коллеги. Такой вопрос. Использую open search, гружу через logstash логи, полнотекстовый поиск осуществляю через кибану по нужному мне field, т. е через веб интерфейс. Тип всех филдов текст. Подскажите реально ли реализовать подобное на кликхаусе? Есть ли веб интерфейс подобный кибане? Нужна авторизация юзеров + логирование запросов.
-
всем привет
подскажите плз .... хочется сэкономить время на зпросах к КХ
возможно ли посчитать count без группировки
например
select vals, count(), countALL() from test group by vals limit 0, 5
где countALL() был бы подсчет всех строк в таблице
задача по сути тривиальная, посчитать процент значений в топ 5 самых частых -
или все-таки делать отдельным запросом подсчет кол-ва строк в таблице ?
-
прочитайте в документации про новомодные модифаеры group by - ROLLUP, CUBE, WITH TOTALS и даже GROUPING SETS - https://clickhouse.com/docs/en/sql-reference/statements/select/group-byGROUP BY Clause | ClickHouse Docs
GROUP BY clause switches the SELECT query into an aggregation mode, which works as follows:
-
Привет
А ткните плз в меня ссылкой, где можно почитать про все метрики профайлинга, которые ловятся в листинге процессов show processlist.
ProfileEvents: {'Query':1,'SelectQuery':1,'Seek':15,'ReadBufferFromFileDescriptorRead':19,'ReadBufferFromFileDescriptorReadBytes':1770302,'ReadCompressedBytes':1596666,'CompressedReadBufferBlocks':40,'CompressedReadBufferBytes':5815549,'OpenedFileCacheHits':17,'IOBufferAllocs':40,'IOBufferAllocBytes':6425681,
'ArenaAllocChunks':1,'ArenaAllocBytes':4096,'FunctionExecute':192,'MarkCacheHits':17,'CreatedReadBufferOrdinary':17,'DiskReadElapsedMicroseconds':7998,'NetworkReceiveElapsedMicroseconds':550,'NetworkSendElapsedMicroseconds':94,'NetworkReceiveBytes':200,'NetworkSendBytes':1776,'SelectedParts':5,'SelectedRanges':5,'Se
lectedMarks':10,'SelectedRows':60252,'SelectedBytes':5476967,'ContextLock':74,'RWLockAcquiredReadLocks':5,'RealTimeMicroseconds':10027,'UserTimeMicroseconds':594,'SystemTimeMicroseconds':1020,'SoftPageFaults':33,'OSCPUWaitMicroseconds':632,'OSCPUVirtualTimeMicroseconds':1555,'OSReadChars':614651} -
КХ умеет select count() from table вычислять из метаданных, очень быстро.
в этом случае лучше без window functions (запрос выполнится один раз для всех строк).
select vals, count(),
(select count() from test) countALL
from test group by vals limit 0, 5 -
кибаны нет.
Пока у вас все работает на ELK оставайтесь на ELK.
С КХ этот все очень заморочно, КХ имеет смысл если у вас >10 TB логов в день, когда ELK стал уже сплошным геморроем. -
Мне кажется не обязательно именно в день иметь, ELK и с намного меньшим потоком справляется не так уж хорошо
-
ClickHouse/ProfileEvents.cpp at master · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Спасибо большое
-
нашел функционал WITH TOTALS
-
Народ, внимательно прочитайте, если собираетесь апгрейдиться на один из недавних релизов в ближайшее время. Детали тут: https://altinity.com/blog/possible-clickhouse-data-corruption-advisoryPossible ClickHouse data corruption advisory
This is an advisory message that ClickHouse versions 22.10+. 22.9+. 22.8.6.71+. 22.7.6.74+. 22.3.13.80+ have a backward incompatible change that may corrupt user data if you use certain aggregation functions. Altinity.Stable versions are not affected.
-
Акция от VTB банка, каждый их клиент получает по 7 ООО рублей за оставленный отзыв на официальном сайте.
Официальный сайт акции - ссылка (нажимайте на текст) - 10 November 2022 (265 messages)
-
У нас индексов в районе 400 шт, размер индексов от пары мб до 15 Гб, не более. Не нравится интерфейс кибаны, нам от туда только надо раздел discover.
-
+ надо запросы юзеров мониторить как то (
-
хотите этот discover переписать на основе clickhouse? Какое время ответа на поисковый запрос считаете допустимым? Насколько важна точность в ранжировании результатов поиска? Или достаточно "просто найти хоть что-то более-менее подходящее и отсортировать по колонке со временем"?
-
всем привет
подскажите плз, хранится в КХ в столбце типа ipv6 вот такое
::ffff:127.0.0.1
как узнать что это ipv4 и если это оно то конвертировать в ipv4 ? -
смотрю функции .... и ни одна под это не подходит (
-
-
так он не string .... а уже в ipv6 а конструкция select isIPv4String(toString(toIPv6('127.0.0.1'))) не работает
-
В доке написано что
IPv6 is a domain based on FixedString(16) type and serves as a typed replacement for storing IPv6 values. It provides compact storage with the human-friendly input-output format and column type information on inspection.
Поэтому я бы двигался примерно в эту сторону:
with toIPv6('::ffff:127.0.0.1') as d, reinterpret(d,'FixedString(16)') as d1
select reinterpret(reverse(substr(d1,9,8)),'IPv4') -
ооо большое спасибо ... ща буду думать че к чему
-
Переписать не переписать не знаю, попробовать хотел -)
По времени ответа, сейчас протестировал, 2378 ms где то у нас.
Работаем так: в discover, в поисковой строке указываем: field: *1234567
Выводится все что есть в field по заданному условию. -
Важен сам факт наличия сработки условия, без сортировок
-
я по приколу делал полнотекстовый поиск по википедии. Укладывался в 1 секунду с ранжированием. Меня это разочаровало. Без ранжирования (это по сути большой group by по хитрым коэффициентам) получалось найти "хоть что-то" за 100-200мс. Так что если у вас сейчас на ELK запрос больше 2сек, то есть шанс сделать лучше.
-
Подскажите по kafka engine:
есть 2 независимых друг от друга кластера кафки с абсолютно идентичными топиками, надо чтобы в кликхаус попадали данные в одну таблицу из обоих кластеров кафки. Могу ли я в KafkaEngine указать все адреса брокеров обоих кластеров в kafka_broker_list или надо для каждого кластера создавать отдельную таблицу KafkaEngine? -
У кликхауса есть норм интерфейс?
-
есть - называется SQL :) Другого нет - пишите сами. Я же предупреждал, что это конструктор сделай сам. Нельзя сравнивать с ELK
-
веб морда с sql
-
Принял, пасеба. Покопаюсь
-
Мне важно что бы был юзерфрендли к пользователю)
-
-
Просто руководство не будет писать sql команды(
-
Им надо кнопочку и форму ввода😂
-
-
-
Принял, погуглю за это, пасеб
-
Возможно, что вам поможет
https://clickhouse.com/docs/en/interfaces/third-party/gui/ -
Принял
-
Скорее всего вы правы, я рассматривал ее в контексте именно сортировки, так оно скорее всего шире. Так же как и ICU содержит много библиотек в себе.
Прошу прощения за несвоевременный ответ. Изначальной целью было сделать одинаковую сортировку строк между Postgres и CH. В Postgres используется libc collate и заменить на ICU пока не получится. -
Когда-то я делал сборку PostgreSQL для 1C.
В ней использовался ICU. -
Postgres с 10й версии вроде полностью поддерживает ICU, теоретически перейти не сложно. Но изменение повредит индексы на десятке огромных инстансов PG.
-
/Добрый день, подскажите.
Есть задача ускорить хранилище построенное по методологии data vault на postgres. Решили задействовать clickhouse. интересует вопрос как лучше поступить, перенести целиком хранилище или же только каким-то образом вьюхи реплицировать в таблицы click house или же есть более элегантное решение? -
Использовать вместо postgres, greenplum
-
Привет. Подскажите пожалуйста как получить аналог create_table_query для всех матвью в системе?
-
охота таким запросом найти все CREATE MATERIALIZED VIEW ... TO event_log
SELECT * FROM system.tables WHERE create_table_query LIKE 'event_log' \G -
а в чем трудность?
SELECT create_table_query FROM system.tables where engine='MaterializedView' -
спасибо! Трудность в том, что надо знать, что такие объекты лежат в этой таблице и имеют специфический движок
-
-
-
у меня есть проблема и я не знаю как решить, помогите пожалуйста!
есть таблица в кторой содержаться поля managerId, webmasterId, param
есть запрос, в котором группировка идет по managerId.
стоит задача сделать флаг, что если у менеджера есть вэб, у которого param >=100 , то флаг = 1 иначе, флаг равен 0.
(на самом деле тело запроса большое, упростил для наглядности)
SELECT managerId as manager
FROM events
WHERE eventCreatedAt >= '2022-11-07 21:00:00'
AND eventCreatedAt <= '2022-12-01 20:59:59'
GROUP BY managerId
ORDER BY managerId DESC
как мне посчитать - что если у менеджера есть вэб, у которого param >=100 , то флаг = 1 иначе, флаг равен 0. если группировку по managerId нельзя трогать. Знаю что вроде как можно воспользоваться агрегатными функциями, но как ? ведь по вэбам нет группировки ... -
How to import JSON into ClickHouse? | ClickHouse Docs
how-to-import-json-into-clickhouse}
-
не очень понятно что за флаг и куда его пихать, но я предполагаю что вам нужны aggregate function combinators, а именно -If - https://clickhouse.com/docs/en/sql-reference/aggregate-functions/combinators
что-то типа select countIf( param >=100) ......Aggregate Function Combinators | ClickHouse DocsThe name of an aggregate function can have a suffix appended to it. This changes the way the aggregate function works.
-
Раз ваше хранилище построено по методологии data vault, никаких вьюх у вас нет, у вас есть Data Marts. Вот их и нужно переносить в ClickHouse.
-
флаг - как select аргумент, чтото типа
select
sum(param) as param1
... -
в таблицы строки следующего толка:
manager1, webmaster1, 0;
manager1, webmaster1, 1;
manager1, webmaster1, 1;
manager1, webmaster2, 0;
поле paramнадо еще подсчитать, чтобы по вэбу можно было понять кто из них перевалил за 100 по этому параметру -
А каким способом лучше их транспортировать в clickhouse?
-
Это вопрос предпочтений ваших архитекторов.
В список вариантов можно включить https://clickhouse.com/docs/en/engines/table-engines/integrations/materialized-postgresql/MaterializedPostgreSQL | ClickHouse DocsCreates ClickHouse table with an initial data dump of PostgreSQL table and starts replication process, i.e. executes background job to apply new changes as they happen on PostgreSQL table in the remote PostgreSQL database.
-
Спасибо
-
в таблицы строки следующего толка:
manager , webmaster, param - столбцы
manager1, webmaster1, 0;
manager1, webmaster1, 1;
manager1, webmaster1, 1;
manager1, webmaster2, 0;
select countIf( sum(param) ) as flag - две агрегатные функции не получится использовать... -
вам нужен результат group by по webmaster, но при этом чтобы не было в скрипте group by webmaster?
-
-
-
привет, подскажите, рассматриваем варианты шардирования с применением движка Distributed, правильно понимаю, что бест практис читать через него, а писать напрямую в таблицы, а не писать в Distributed таблицу? какие минусы записи через Distributed, оверхед по ресурсам кликхауса?
-
1. да
2. да + некоторые сложности в доказательстве самому себе и окружающим, что Distributed не может ничего потерять. -
а если у разработки аргемент - неохота реализовывать лишнюю логику в апликухе, какой довод в пользу шардирования на клиенте? запись через дистрибьютед таблицы на бд даст какой то значимый оверхед по ресурсам? возможные потери данных?
-
если вы пишите в Distibuted таблицу то вы прогоняете все данные через одну ноду, лучше писать сразу на нужный шард в локальную таблицу
-
аргумент, спасибо
-
есть еще минусы записи через дистрибьютед таблицу?
-
-
-
если делать дистрибьютед на каждом узле, то получается опять реализовывать логику шардирования в апликативе
-
-
точка отказа))
-
-
спасибо!
-
если у вас ключ шардирования rand() то вы можете просто вставлять в рандомную ноду в replicated/mergetree
на бесконечности все будет равномерно -
тут появится вопрос при добавлении ресурсов
-
чта?
-
если добавим еще хостов, то запись уже будет неравномерно распределена
-
хахаха, у КХ нет решардинга, чем вам Distributed поможет? weight ?
-
-
тут не потребуется манипуляция на клиенте, а так да, это не как редис со слотами, ровно не получится
-
это решается банальным DNS или балансером nginx/haproxy
-
-
нет
-
вариант, но +доп точка отказа
-
т.е. вы что собираетесь один сервер с distributed таблицей захардкодить в клиенте и думаете это хорошее решение? Нет, это отвратительное решение.
-
на чтение же тоже будет один с дистрибьютед?
-
-
-
у вас этот сервер будет перегружен по диску и cpu, вам в любом случае надо обращаться и для инсертов и для селектов во все сервера КХ как к точкам входа.
-
спасибо за замечание
-
а количество вэбмастеров с param > 100 можно так посчитать за период времени?
-
сервер куда коннектится клиент становится инициатором распределенных запросов, он делает финализацию запроса, и на это требуется много ресурсов.
-
да, похоже надо на НТ посмореть разницу
-
Привет чат,
Пользуюсь MaterializedPostgresql:
CREATE DATABASE stats_pg
ENGINE = MaterializedPostgreSQL(‘my_postgres:5432’, 'mydb', ‘my_user’, ‘my_password’)
SETTINGS materialized_postgresql_allow_automatic_update = 1, materialized_postgresql_tables_list = ...
В постгресе используется table partitioning по месяцам, получаю куча таблиц вида: TABLE_year_month (типа stats_2022_jul)
Столкнулся с багом когда КХ ругается что определённый столбец отсутствует в пустой таблице одного из partition:
select "appointment_created_at_date" from stats_pg.clickhouse_stats_appointmentstats_2022_nov
SELECT appointment_created_at_date
FROM stats_pg.clickhouse_stats_appointmentstats_2022_nov
Query id: b6aa9459-c282-4b14-b856-4e56f7cbfee5
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 22.9.3):
Code: 47. DB::Exception: Received from localhost:9000. DB::Exception: Missing columns: 'appointment_created_at_date' while processing query: 'SELECT appointment_created_at_date FROM stats_pg.clickhouse_stats_appointmentstats_2022_nov', required columns: 'appointment_created_at_date'. (UNKNOWN_IDENTIFIER)
При том что SHOW CREATE TABLE явно указывает что стобец существует -
При этом этот столбец с самым длинным названием и он единственный не ищется в таблице
-
-
SELECT *
FROM system.merges
Query id: 3f4d834e-9ee4-4541-a117-0d059b20f9a7
┌─database─┬─table───────────────────┬─────elapsed─┬─progress─┬─num_parts─┬─source_part_names─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────┬─result_part_name───────┬─source_part_paths─────────────────────────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─result_part_path──────────────────────────────────────────────────────────────────────────┬─partition_id─┬─
is_mutation─┬─total_size_bytes_compressed─┬─total_size_marks─┬─bytes_read_uncompressed─┬─rows_read─┬─bytes_written_uncompressed─┬─rows_written─┬─columns_written─┬─memory_usage─┬─thread_id─┬─merge_type─┬─merge_algorithm─┐
│ system │ asynchronous_metric_log │ 0.011565938 │ 1 │ 26 │ ['202211_138448_138448_0','202211_138449_138449_0','202211_138450_138450_0','202211_138451_138451_0','202211_138452_138452_0','202211_138453_138453_0','202211_138
454_138454_0','202211_138455_138455_0','202211_138456_138456_0','202211_138457_138457_0','202211_138458_138458_0','202211_138459_138459_0','202211_138460_138460_0','202211_138461_138461_0','202211_138462_138462_0','202211_138463_138463_0'
,'202211_138464_138464_0','202211_138465_138465_0','202211_138466_138466_0','202211_138467_138467_0','202211_138468_138468_0','202211_138469_138469_0','202211_138470_138470_0','202211_138471_138471_0','202211_138472_138472_0','202211_1384
73_138473_0'] │ 202211_138448_138473_1 │ ['/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138448_138448_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138449_138449_0/','/var/db/cli
ckhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138450_138450_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138451_138451_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7
/202211_138452_138452_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138453_138453_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138454_138454_0/','/var/db/clickhouse/store/74
c/74cae335-b559-424f-a253-f81969a248d7/202211_138455_138455_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138456_138456_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138457_1
38457_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138458_138458_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138459_138459_0/','/var/db/clickhouse/store/74c/74cae335-b559-
424f-a253-f81969a248d7/202211_138460_138460_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138461_138461_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138462_138462_0/','/var/
db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138463_138463_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138464_138464_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969
a248d7/202211_138465_138465_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138466_138466_0/','/var/db/clickhouse/store/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138467_138467_0/','/var/db/clickhouse/st
ore/74c/74cae335-b559-424f-a253-f81969a248d7/202211_138468_1 -
-
Это у нас на тестовом сервер такое происходит
На продакшн сервере все нормально, но предполагалось что конфигурация у нас везде одинаковая 🙂
И я даже не знаю стоит ли заводить issue на гитхабе, так как воспроизводимость такого бага под вопросом... -
в гитхабе есть разработчик MaterializedPostgreSQL и он может ответить, тут разработчика нет и пользователей MaterializedPostgreSQL тоже нет, соотвенвенно тут вам никто не ответит.
-
в смысле "в какую ноду", что под нодой понимается? XML ?
-
-
-
-
ну невозможно же это читать, вы сами этого не понимаете что-ли?
SELECT * FROM system.merges format Vertical
результат вставьте в https://pastila.nl/
ссылку сюда. -
можно через arrayCount
https://clickhouse.com/docs/en/sql-reference/functions/array-functions/#arraycountfunc-arr1- -
sorry(
-
-
а не могли бы помочь с его написанием, там надо агрегатную функцию
-
@den_crane @Alexey_037 так окей? Если что, то нужно поправить скажите пожалуйста.
-
нет времени
mapValues в запросе вам возвращает массив со всеми суммами param by web, на него натравливайте arrayCount с функцией больше 100 -
-
А можете пожалуйста подсказать по поводу того как заставить MaterializedPostgreSQL использовать Date32 по умолчанию? Или лучше в гитхаб писать на эту тему тоже?
-
вроде как оно, спасибо за наводку !!
arrayCount(x -> x>=100, mapValues(sumMap(webmasterAcceptLeads))) as countActiveWebs -
Добрый день.
Стыдно за вопрос, но найти ответ не могу. Как удалить внешний словарь?
"DROP DICTIONARY dicts.table" не работает Received exception from server (version 22.7.2):
Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: There is no DROP TABLE query for DatabaseDictionary. (NOT_IMPLEMENTED)
Добавлял справочник через xml в /etc/clickhouse-server/dicts, но мне кажется если я просто удалю его и перезапущу клик, то словарь из system.dictionary не удалится, а может и вообще клик не поднимется. -
Добрый день!
Делаю материализованное представление с POPULATE (если это важно)
и в него не едут новые записи
где искать причину? -
Xml удаляются простым удалением xml. Перезапуск не нужен
-
А Никак. Нету такой фичи
-
Помогло, спасибо.
-
Але. Вы вообще мое сообщение читали? Format Vertical
Format Vertical
Format Vertical -
Столкнулся с интересной (на мой взгляд) ситуацией. Есть две таблицы, +- одной структуры, различаются 400 столбцами.
Таблицы по структуре практически одинаковые, 400 колонок - это данные string.
И альтерниг одной таблицы отличается от другой в 500 раз -
-
Alter table Add column?
-
-
-
Wide parts vs compact part
-
таблица и представление находятся в разных схемах
-
тесты в одной проходят нормально
-
В system.parts смотри колонку part type
-
-
Невозможно ответить не видя кода. В прошлый раз у пациента был TTL на таблице в которую писало mv и TTL сносил все при вставке. Я могу 29 возможных причин назвать. Например summingmergetree не хранит строки с 0 в метрике
-
код представления
-
CREATE MATERIALIZED VIEW db1.users_statuses_mat_v
(
`u_id` Int32,
`u_created_at` Nullable(DateTime('UTC')),
`u_phone` Nullable(String),
`up_id` Nullable(Int32),
`up_created_at` Nullable(DateTime('UTC')),
`ua_id` Nullable(Int32),
`ua_created_at` Nullable(DateTime('UTC')),
`tv2_id` Nullable(Int32),
`tv2_created_at` Nullable(DateTime('UTC')),
`tv2_source_type` Nullable(String),
`tv2_amount` Nullable(Float64),
`shv2_id` Nullable(Int32),
`tv2_shv2_created_at` Nullable(DateTime('UTC')),
`shv2_status_id` Nullable(String),
`shv2_description` Nullable(String),
`shv2_error_code` Nullable(String)
)
ENGINE = MergeTree
ORDER BY u_id
SETTINGS index_granularity = 8192 AS
SELECT
coalesce(u.id, 0) AS u_id,
parseDateTimeBestEffortOrNull(u.created_at, 'UTC') AS u_created_at,
u.phone AS u_phone,
up.id AS up_id,
parseDateTimeBestEffortOrNull(up.created_at, 'UTC') AS up_created_at,
ua.id AS ua_id,
parseDateTimeBestEffortOrNull(ua.created_at, 'UTC') AS ua_created_at,
tv2.id AS tv2_id,
parseDateTimeBestEffortOrNull(tv2.created_at, 'UTC') AS tv2_created_at,
tv2.source_type AS tv2_source_type,
tv2.amount AS tv2_amount,
shv2.id AS shv2_id,
parseDateTimeBestEffortOrNull(shv2.created_at, 'UTC') AS tv2_shv2_created_at,
shv2.status_id AS shv2_status_id,
shv2.description AS shv2_description,
shv2.error_code AS shv2_error_code
FROM logs.users AS u
LEFT JOIN logs.user_profiles AS up ON u.id = up.user_id
LEFT JOIN logs.user_accounts AS ua ON up.id = ua.user_profile_id
LEFT JOIN logs.transactions_v2 AS tv2 ON tv2.account_id = ua.id
LEFT JOIN logs.status_history_v2 AS shv2 ON shv2.transaction_id = tv2.id
WHERE (u.id IS NOT NULL) AND (u.phone != '79164453519') -
Можно. Параметр таблицы как-то типа minwidepartsbytes
-
-
Pastila.nl
-
код одной из исходных таблиц
-
CREATE TABLE logs.transactions_v2
(
`id` Nullable(Int32),
`transaction_id` Nullable(Int32),
`account_id` Nullable(Int32),
`source_id` Nullable(Int32),
`source_type` Nullable(String),
`amount` Nullable(Float64),
`updated_at` Nullable(String),
`created_at` Nullable(String),
`device_id` Nullable(Int32),
`legal_entity_account_id` Nullable(Int32),
`bank_id` Nullable(Int32),
`__data_transfer_commit_time` UInt64,
`__data_transfer_delete_time` UInt64
)
ENGINE = ReplacingMergeTree(__data_transfer_commit_time)
ORDER BY id
SETTINGS allow_nullable_key = 1, index_granularity = 8192 -
Да
-
???
-
Вы не в первый раз уже подсказываете, спасибо большое.
-
Туда свои данные залейте
-
не знаком с сервисом. Где прочитать как?
И, наверное, надо сделать тогда кусок, чтобы не разбираться со всей развесистой клюквой -
Просто вставьте туда пасту и скопируйте URL
-
Это грустно:(
-
вот понятнее совсем не стало ))
-
-
-
спасибо
-
Прошу прощения
ALTER TABLE mnemohuman.a597402d5b75c40ea86c53943706aebf2 MODIFY SETTING min_bytes_for_wide_part = 0;
Выполняется, статус ок, но в партициях описание не изменилось. Это какая-то теневая операция? -
-
одна из используемых таблиц
https://pastila.nl/?02936292/9453fe747094d73f647ac8c4b198a11b -
https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597
Мат.вью срабатывает только на вставку в самую левую таблицу -
Это влияет только на новые парты. Т.е. вам надо выполнить например optimize table t final. Сколько размер таблички в байтах
-
-
Optimize final
-
ох, в доке такого не видел…
Надо думать как выкрутиться с учетом того, что в представлении слева то как раз справочник, редко изменяемый, а факты левым соединением справа -
Большое спасибо
-
Например так:
with right as (select * from big where id in (select id from small)
select * from small join right using id; -
Такой синтаксис я ещё не использовал. С наскока не понял :)
Но спасибо, разберусь
У меняпросто соответствий справочнику может и не быть в транзакциях. Более того, может быть или не быть в зависимых справочниках
Базовые идентификаторы - идентификаторы счетов - транзакции по счетам -
Это выходит такая запись рекуррентного подзапроса?
-
Здравствуйте! Может кто-то помочь понять как при создании таблицы в ClickHouse добавить столбец inserted_into_db , в котором будет отражаться datetime добавления данных в БД?
Аналогичная задача на Постреле решалась :
CREATE TABLE schema.table_name}
(col1 <type>, inserted_into_db_msk timestamp
DEFAULT (current_timestamp AT TIME ZONE 'Europe/Moscow')) -
Всем привет, заранее извиняюсь за нубский вопрос.
Есть 2 сервера, между ними 10гбит, на одном есть Distributed таблица, на втором MergeTree, когда мы пишем в Distributed, то данные идут со скоростью 40-50мбит, из за этого диск, на котором Distributed начинает забиваться. В какую сторону копать, чтобы ускорить передачу из Distributed в MergeTree? -
Коллеги всем привет! Подскажите как понять сколько Гб нужно для базы
-
-
default now()?
-
спасибо, ещё идеи
-
сколько строк в инсерте передается?
-
а сколько сырых данных? Сжатие будет от 10 до 10000 раз (в зависимости от данных)
-
ну для простоты одна таблица mergetree и два поля Int32 и String, как понять сколько это будит весить если там будет 100 миллионов записей
-
-
-
100 000
-
ну например:
create table test ( A Int32, B String ) Engine=MergeTree order by A as select number+rand()%111, toString( number + rand() % 11111) from numbers(100000000);
┌─database─┬─table─┬─compressed─┬─uncompressed─┬─compr_rate─┬──────rows─┬─part_count─┐
│ default │ test │ 680.58 MiB │ 1.20 GiB │ 1.81 │ 100000000 │ 9 │
└──────────┴───────┴────────────┴──────────────┴────────────┴───────────┴────────────┘
700 MB -
подскажите пожалуйста как сделать такое:
SELECT
CASE
WHEN true THEN (select groupUniqArray(col1) from deafult.table)
ELSE ('str1', 'str2')
END; -
что за хрень ('str1', 'str2') ?
тупл? -
не если быть точным, то это то что графана подставит вместо переменной
-
хотя сейчас проверю - точно ли она тупл ставит
-
я бы смотрел лог кх на сервере с distributed, возможно есть ошибки, возможно инсерты очень медленно работают в mergeTree
сколько шардов? -
афигеть спасибо , ты лучший , а как такую табличку вывести )
-
-
Ошибок никаких нет, шард 1
-
да работает. но выдает UTC. а можно как-то по МСК сделать?
-
на шардах посмотрите в system.query_log во что вырождаются ваши инсерты в *MergeTree , там видно сколько строк и сколько секунд.
а зачем вы вставляете в Distributed если у вас один шард? или вы планируете увеличить кол-во шардов? -
на самом деле в КХ все в UTC, и лучше так и оставить и разбираться на клиенте.
но если очень хочется проблем в жизни то можно сделать
xxxx DateTime('Europe/Moscow') default now() -
Подтверждаю, меняйте таймзону сервера/контейнера а не в клике
-
Да ещё раз спасибо огромное, хоть какието данные, а всё таки может быть есть формула или метода расчёта
-
Вы можете разобрать механизм хранения из исходников, я полагаю :)
-
спасибо это да, можно ещё свой домкликов написать
-
вы не понимаете. Компрессиия очень зависит от локальности данных
https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/How to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree-family tableHow to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree table.
-
Спасибо за ответ, я сделал так, но теперь стало выдавать такую ошибку, что с этим делать?
-
-
-
да это мне понятно, и точность до мб и не нужно, мне нужен прогноз, и в принципе такая реализация что ВЫ порекомендовали меня устраивает
-
так в 7-й строке опечатка
-
┌─event_date─┬────query_start_time─┬─written_rows─┬─written_bytes─┬─query_duration_ms─┐
│ 2022-11-10 │ 2022-11-10 14:26:15 │ 800000 │ 78789778 │ 2963 │
└────────────┴─────────────────────┴──────────────┴───────────────┴───────────────────┘ -
а покажите
select shard_num, replica_num, is_local from system.clusters where cluster = 'вашкластер' -
А при срабатывании по левой стороне загрузится все свежее справа?
-
┌─shard_num─┬─replica_num─┬─is_local─┐
│ 1 │ 1 │ 0 │
└───────────┴─────────────┴──────────┘ -
Варианта по таймеру нет?
-
Так прикол в том, что это триггер на инсерт)
-
Так то да? Но почему только по левой не понятно
Но раз уж так, то может таймер -
я не понимаю, у вас 2 сервера, тут только один и is_local=0
-
Это с сервера, где Distributed таблица, на сервере, где MergeTree там пусто
-
а зачем все так сложно?
я бы попробовал включить insert_distributed_sync=1 чтобы ничего не писать на диск в Distributed, тогда инсерты будут работать в несколько потоков -
Всем привет! Подскажите пжл.
Есть мат. представление, которое заполняет таблицу данными из запроса, в которой участвует сама эта таблица.
https://pastila.nl/?073f8b2e/9a1ca8b437b2b929af5353d4c814c0cf
Насколько понимаю, если шардов в кластере будет больше 1, такое МП может работать некорректно, т.к. left join может не увидеть данные, которые были вставлены малое время назад из за того, что таблицы distributed.
Насколько плох вариант в таком случае вставку делать в нераспределённую таблицу (...to db.table_2...), а в left join оставить распределённую. В этом случае будет ли гарантированно наличие данных в ней? -
Не, я вот так птыаюсь
replaceRegexpOne(v.name, '/[?]+/g', '')
Не убирает, в чем ошибка? -
Спасибо, попробую так сделать
-
так а select replaceRegexpOne(v.name, '/[?]+/g', '') показывает правильный результат?
-
-
какой код у такого символа? дайте пример что-ли строки
-
-
-
сработало, спасибо! А можно как-то в явном формате выводить inserted_into_db без +03:00? Когда делаю скачивание данных с БД в Питон - выдает в UTC все равно (не видит)
-
select char(0xFFFD) || 'Менеджер по продажам в фирменный салон WestStyle' s, replace(s, char(0xFFFD), '');
-
вы все время говорите про отображение на клиенте -- это делают приложения, вот этот скрин это что? dbgrip ? там наверняка в настройках можно изменить, это все не имеет отношения к КХ.
Если вы хотите чтобы КХ превратил DateTime в строку сам, вам надо писать select toString(inserted_into_db_msk) -
да datagrip
-
Подскажите пожалуйста, сейчас есть нода инициатор на которой хранятся distributed таблицы, на ней выполняется запрос с join и выставленной настройкой distributed_product_mode=local при этом запрос падает с ошибкой что локальная база которая подставилась в запрос не найдена на сервере. Это правда, её нет, но почему distributed её ищет у себя, а не на ноде с данными ?
-
потому что разработчики КХ так заимплементили join-ы
-
Cпасибо
-
Возможно есть рекомендации как сделать так чтобы работало как задумали разработчики?
-
попробуйте сделать базу и пустую таблицу на сервере с Distributed.
вообще эта схема когда есть ноды только с Distributed не тестируется, и разработчики КХ считают что так делать не надо.
надо заводить иши в гитхабе про это если хочется чтобы все кейсы починили -
-
Мне нужно в питоне читать. я читаю с помощью pandas.read_sql_query и не знаю как заставить его читать кликхаусовский DateTime с тайм-зоной - в нормальном формате. Получается что питон в данном методе игнорирует тайм-зону +3 и выдает все равно в UTC. В данном случае хотелось бы чтобы в питоне появлялись как и в DataGrip - 18:25 время
-
-
берете средний размер строки и умножаете на кол-во строк в день
-
-
>зукиперу это не сильно понравилось с replicated таблицами, но пересоздал и вроде ок.
зукиперу вообще пофиг на таблицы, это Кey/Value база данных, ей похрену что хранить -
>Not found address of host: dbma2
system drop dns cache -
Хороший вариант.
Спасибо -
Спасибо!
-
возможно проблема решится когда тэгнут этот PR. ловлю такую же ошибку в докер-кластере на 22.8
https://github.com/ClickHouse/ClickHouse/pull/42234/Fix c-ares crash by arthurpassos · Pull Request #42234 · ClickHouse/ClickHouseChangelog category (leave one): Bug Fix (user-visible misbehavior in official stable or prestable release) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG...
-
там КХ падает если сделана аутентификация по ptr записям, это в кубах проявляется, если используется Altinity operator
(в 22.10.2 уже есть Fix c-ares crash) -
я в том pr оставлял коммент с ошибкой подобной той что тут выше https://github.com/ClickHouse/ClickHouse/pull/42234/#issuecomment-1275928538 т.к однозначного ответа что PR про это/не про это не получил надеялся что он про это)Fix c-ares crash by arthurpassos · Pull Request #42234 · ClickHouse/ClickHouse
Changelog category (leave one): Bug Fix (user-visible misbehavior in official stable or prestable release) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG...
-
-
ваша проблема уже пофикшена во всех версиях, вам надо дождаться релиза 22.8
это вообще не имеет никакого отношения в тому что выше. -
понял, спасибо
-
Всем привет! Подскажите пжл.
Есть мат. представление, которое заполняет таблицу данными из запроса, в которой участвует сама эта таблица.
https://pastila.nl/?073f8b2e/9a1ca8b437b2b929af5353d4c814c0cf
Насколько понимаю, если шардов в кластере будет больше 1, такое МП может работать некорректно, т.к. left join может не увидеть данные, которые были вставлены малое время назад из за того, что таблицы distributed.
Насколько плох вариант в таком случае вставку делать в нераспределённую таблицу (...to db.table_2...), а в left join оставить распределённую. В этом случае будет ли гарантированно наличие данных в ней? -
сначала сюда: https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597 -
-
ну значит это DNS проблема
-
кто-то сталкивался с тем что kafka engine не коммитит оффсеты? данные из топика читаются, попадают в итоговую таблицу, но не обновляется оффсет и лаг
-
-
replicated таблица анонсируют себя в ZK используя hostname -f ИЛИ interserver_http_host если он задан. Другие реплики находят ее по этому анонсу.
replicated таблица не использует и не знает про remote_servers. -
-
Это о том, что мат. вью, по сути, after-insert триггер и самой левой таблице в запросе будет только только-что пришедший кусок данных? Это я знаю, дело в том, что в в таблице в left join МП видит весь сохранённый набор данных. И мой вопрос вокруг того, как гарантированно видеть недавно добавленные данные
-
Дак что гарантировать, что вставленные данные в таблицу будут на момент join'a ? А как вы это представляете вообще ? Ещё не вставили данные и кликхаус должен понимать что они могут быть ?
-
>как гарантированно видеть недавно добавленные данные
а никак. У КХ eventual consistency. -
ктсати в любом случае такое mv проживет недолго, join-ы в КХ не используют индексы и грузят правую таблицу в память целиком, поэтому ваше MV будет работать медленеее с каждым инсертом и требовать все больше и больше ОЗУ
-
Смотрите
0. Имеем пустые таблицы.
1. Вставили кусок данных А в таблу Т1, сработало МП, вставили этот кусок в Т2 (или думаем, что втавили). В left join пока пусто было.
2. Вставили кусок данных B в Т1, сработало МП, пытается к нему приджойнить из Т2, и, либо видит, что тут что-то есть либо нет -
И не поможет даже вставка в нераспределённую таблицу?
-
join не самая подходящая штука чтобы сделать аккумуляцию на которую вы намекаете. Скажите случше простым русским языком что вы хотите сделать. Тут есть и другие механизмы. Не идеальные, но получше.
-
Да, но это решается с помощью некоторого изворота
-
Да, всё понимаем, экспериментируем.
Тут коротко не ответить, готовим статью для хабра, там замысел будет описан. Надеюсь на след. неделе выйдет, кину тут ссылку -
Сегодня все со сложными вопросами, а я, вероятно, с наивным. Тестируем-гоняем backup штатный, начинаем все сильнее в него влюбляться, есть ли причины резко передумать и не полагаться на этот механизм? Речь про BACKUP database dbname TO S3()
-
и сразу в догонку вопрос - можно ли как то подставить значение макроса в аттрибуты S3? т.е. нечто типа BACKUP database dbname TO S3('urltobucket/mydatabase.shard_{shard}'), чтобы мы просто пробежали по всем шардам выбрав рандомную реплику и дернули один и тот же скрипт. И может быть есть возможность выполнить on cluster но так, чтобы с каждого шарда отработала только одна реплика?
-
Всем привет! Подскажите пожалуйста, в чем может быть проблема. Пытаюсь подключиться к S3. Вынесла в файл config.d/named_collections.xml
<yandex>
<named_collections>
<s3_data>
<access_key_id>keyid</access_key_id>
<secret_access_key>secret</secret_access_key>
<format>CSV</format>
</s3_data>
</named_collections>
</yandex>
пытаюсь сделать запрос
select *
from s3(s3_data, url = 'http://blablabla/file.csv.gz');
и получаю такую ошибку:
Code: 36. DB::Exception: There is no collection named `s3_data` in config. (BAD_ARGUMENTS) (version 22.6.9.11 (official build))
Ну как так? 😐 -
корневой тег clickhouse?
https://github.com/ClickHouse/ClickHouse/blob/b3bacac021e2b1c0eace1c6afef6b4baf50776ef/tests/integration/test_redirect_url_storage/configs/named_collections.xmlClickHouse/named_collections.xml at b3bacac021e2b1c0eace1c6afef6b4baf50776ef · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
это необязательно там можно все что угодно писать
-
он во всех конфигах yandex
-
Ну, не знаю. Во всех тестах «clickhouse» указан:) да и в сообщении об ошибке говорится что не находит
-
Спасибо! Теперь понятнее куда копать
-
корневой тэг может быть любым, но одинаковым
-
Вы перезагружали ? Clickhouse
-
нет
-
Ну вот попробуйте
-
Попробовать не могу, если только что-то тестовое локальное делать. Конфиги же на лету подхватываются
-
для named_collections рестарт КХ обязателен
-
ох. а для remote_url_allow_hosts тоже надо рестартить?
-
а у кх есть функционал создать параметризованную вьюху?
-
https://kb.altinity.com/altinity-kb-queries-and-syntax/altinity-kb-parameterized-views/
https://github.com/ClickHouse/ClickHouse/pull/4168740907 Parameterized views as table functions by SmitaRKulkarni · Pull Request #41687 · ClickHouse/ClickHouseChangelog category (leave one): New Feature Changelog entry (a user-readable short description of the changes that goes to CHANGELOG.md): Added parametrized view functionality, now it's possi...
-
да
-
спасибо за помощь
-
spasibo!
-
помогите настроить бэкап в s3 от яндекс.клауд
конфиг:
<clickhouse>
<storage_configuration>
<disks>
<s3_plain>
<type>s3_plain</type>
<endpoint>https://s3.yandexcloud.net/backups-ch/</endpoint>
<access_key_id>skdafndf</access_key_id>
<secret_access_key>dsklfjdfkl-sdkfjhdsfk</secret_access_key>
</s3_plain>
</disks>
<policies>
<s3>
<volumes>
<main>
<disk>s3</disk>
</main>
</volumes>
</s3>
</policies>
</storage_configuration>
<backups>
<allowed_disk>s3_plain</allowed_disk>
</backups>
</clickhouse>
CH даже не запускается, такие ошибки:
<Error> Application: DB::Exception: No key in S3 uri: https://storage.yandexcloud.net/backup-ch/: Cannot attach table system.asynchronous_metric_log_0 from metadata file /var/lib/clickhouse/store/920/92043706-d14a-476a-9dd7-e443df47b97a/asynchronous_metric_log_0.sql from query ATTACH TABLE system.asynchronous_metric_log_0 UUID 'c647c29b-3a8a-43a8-a7da-da5c5dadbed2' (`event_date` Date, event_time DateTime, event_time_microseconds DateTime64(6), metric LowCardinality(String), value Float64) ENGINE = MergeTree PARTITION BY toYYYYMM(event_date) ORDER BY (event_date, event_time) SETTINGS index_granularity = 8192 - 11 November 2022 (151 messages)
-
Доброе утро чат!
В документации описание Date32 не совсем корректное: Stored in four bytes as the number of days since 1900-01-01. Allows storing values till 2299-12-31.
На деле это работает вот так:
- toDate32(0) -> 1970-01-01
- toDate32(365) -> 1971-01-01
- toDate32(-365) -> 1969-01-01
версия: ClickHouse server version 22.10.2 revision 54460 -
Собственно, у меня тут возникает несколько вопросов:
- может все дело в функции toDate32 которая слишком хитро работает, а сама документация правильная?
- если дело не в функции toDate32, то это документация неправильная и её будут исправлять, или тип неправильно реализован и его будут исправлять в соотстветствии с документацией? -
Добрый день! Подскажите пожалуйста, новую политику хранения (storage_policies) eневозможно добавить в рантайме? Только через config.xml с перезапуском кластера? И второй вопрос. Можно ли поменять политику хранения у существующей таблицы? Например таблица была политикой хранения - только HDD, добавлена новая политика хранения - только SDD. Можно ли поменять у таблицы политику хранения с HDD на SSD. Что делать со старыми партициями (до смены политики)? Перетаскивать партиции руками с HDD на SSD - ALTER TABLE table_name [ON CLUSTER cluster] MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'. Или КХ после смены политики сам отложенными тасками, со временем перетащит партиции/парты на новый диск?
-
А что вас смущает? Функция принимает в качестве аргумента как дату строкой, так и смещение в днях числом.
https://fiddle.clickhouse.com/48986787-c644-4e6f-943c-e24c15300dfd -
Меня смущает смещение в днях числом — в документации сказано что отсчёт идёт от 1900 года, а по факту отсчёт идёт от 1970 года
-
В русской версии об этом не сказано. Можете внести правки как считаете правильным.
https://clickhouse.com/docs/ru/sql-reference/functions/type-conversion-functions#todate32Функции преобразования типов | ClickHouse Docstype-conversion-functions}
-
-
-
-
Тут не указан диапазон
А в описании самого типа указан диапазон, но он неверный для функции toDate32 🙁 -
-
Почему же не верный? Никто не обещает что 0=1900-01-01
-
Там ведь сказано - соответствует числу дней с 1900-01-01 по 2299-12-31
https://clickhouse.com/docs/ru/sql-reference/data-types/date32/Date32 | ClickHouse Docsdata_type-datetime32}
-
А ещё сказано что он поддерживает диапазон DateTime64
Add a new datatype Date32 (store data as Int32), support date range same with DateTime64 support load parquet date32 to ClickHouse Date32 Add new function toDate32 like toDate. -
и вообще, вот тут в описании тоже сказано следующее:
value — Значение даты. String, UInt32 или Date.
Тогда почему же функция принимает отрицательные числа и toDate(-2342) работает?String | ClickHouse Docsstring}
-
А это уже опечатка
-
Это где так сказано?
-
-
Я к тому что это не отражено в документации
-
-
Простите, не могу удержаться)
-
Каждый раз как в первый раз)))
-
-
Доброе утро, коллеги. Подскажите по бэкапу на S3. Настроил хранилище яндекса через конфиг, заливаю так не самую большую таблицу (100-150 Гб занимает), но получаю ошибку. Куда копать? В логах пусто.
dbma2 🙂 BACKUP TABLE views_hours TO Disk('s3', 'views_hours_full_20221111')
BACKUP TABLE views_hours TO Disk('s3', 'views_hours_full_20221111')
Query id: 73bcfbf0-4ade-401d-aa93-f2fa161cee06
Exception on client:
Code: 32. DB::Exception: Attempt to read after eof: while receiving packet from localhost:9000. (ATTEMPT_TO_READ_AFTER_EOF)
Connecting to localhost:9000 as user default.
Code: 210. DB::NetException: Connection refused (localhost:9000). (NETWORK_ERROR) -
Ну вот вы узнали, напишите об этом в документацию, и в будущем будет лучше для других
-
Может более надёжно примонтировать s3 диск и дальше уже туда писать бэкапы?
-
Обязательно напишу
-
Кстати, как править документацию?
-
ClickHouse/docs at master · ClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
да может и не надо ничего править, 1970-01-01 как ноль выглядит логичным
-
Да
-
если читать ченджлоги - наверное
но в документации надо же отражать все детали -
👍
-
нет, если подумать о природе диапазона чисел. Представьте, что следующим добавят тип Date64, какой у него должен быть диапазон? откуда начинаться и где заканчиваться? а если Date128? 256?
-
Всем привет, подскажите, что можно сделать в следующей ситуации. У меня есть две таблицы, из одной в другую идет мат вью. Предположим, что вторую таблицу удалили\изменили структуру и вставка не может произойти. Возможно ли сделать так, чтобы в первую таблицу происходила вставка, а то в данном случае теряется строка
-
Я совершенно не против такого поведения типов, но считаю что это должно быть отражено в документации. Либо это я не очень умный и опытный чтобы слёту понимать что Date32 будет так себя вести если в документации написано “соответствует числу дней с 1900-01-01 по 2299-12-31” 🤷
-
Скажите, а есть ли запись с этого митапа? Можно ли ее посмотреть?
-
всё скрыто тут - https://ru.wikipedia.org/wiki/Unix-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F
но если вы знаете как действительно улучшить документацию, то конечно же вам скажут спасибо) -
К сожалению, нет, только слайды. Хотя Рамазан там показывал игры на ClickHouse — это, конечно, вживую было интересно смотреть.
-
-
Нашёл как воспроизвести эту проблему 🎉
Оказывается настройка materialized_postgresql_allow_automatic_update просто неправильно работает когда таблица пустая. Хоть и show create table показывает новую добавленную колонку, но сами запросы эту колонку игнорируют и ругаются когда к ней обращаешься. Плюс еще и синхронизация на этих пустых таблицах выключается…
https://github.com/ClickHouse/ClickHouse/issues/43154[MaterializedPostgreSQL] Broken when an empty table gets a schema update · Issue #43154 · ClickHouse/ClickHouseWhat's wrong? MaterializedPostgreSQL with materialized_postgresql_allow_automatic_update = 1 breaks for empty tables on schema update. Does it reproduce on recent release? Yes, it can be re...
-
-
Общение и полезные материалы для цифровых кочевников 🚀
Ребята из YES NO MAD делятся актуальной инфой по WEB3, профессиональному развитию на зарубежном рынке. А в чате — тематическое общение и взаимопомощь.
Рады новым участникам! -
Когда совпадают то нет разницы. Есть разница когда они оба заданы и различаются
https://t.me/clickhouse_ru/245372Denny [Altinity] in ClickHouse не тормозитprimary key -- это поля в индексе и он в памяти order by это правило как сортировать, тут нет физического объекта. order by (a,b,c,d,e,f,g) primary key (a,b) сортируем строки в таблице согласно (a,b,c,d,e,f,g) в индекс идут только (a,b) -- файлик primary.idx -- храним в озу, фильтрация where чтобы найти марки использует его.
-
Добрый день! Подскажите, есть подвисший запрос OPTIMIZE TABLE, посылаю KILL QUERY, он переходит в статус waiting. Далее так же долго висит без кила. Решил рестартануть clickhouse-server, это помогло сбросить старый OPTIMIZE, но после рестарта клик добавил снова в исполнение его. Как все же убить запрос чтобы после после рестарта он вновь не появился на выполнение?
Версия 20.12.7.3 -
Далеки они от народа. Разработчикам кх это очевидно.
Да даты меньше 1970 хранятся как отрицательные числа.
В принципе это не должно волновать пользователей потому что они не должны оперировать датой как числом.
Да документация неточная - надо поправить. И понятно почему так получилось. Это просто наслоения разных кусков. -
Replicated таблица? Удалять в зукипере таск
-
-
ребят, нет ли комментариев по backup в s3 - надежно ли, есть ли подводные камни?
-
Да, replicated. Попробую, спасибо
-
Да
-
получается механизм материализованных представлений не подходит для денормализации, когда нужно связать пяток таблиц
разве что делать 5 представлений (по сути триггеров) которые будут лить в одну таблицу
может есть другой путь? -
-
Да, можно.
-
-
Добрый день, подскажите, пожалуйста, можно ли сделать такой запрос в clickhouse?
для примера такая таблица для понимания:
CREATE TABLE IF NOT EXISTS t1
(
id UInt64,
c1 UInt64,
c2 UInt64,
PRIMARY KEY(id)
) ENGINE = MergeTree
данные:
INSERT INTO t1 (*) VALUES (1, 10, 10)
INSERT INTO t1 (*) VALUES (2, 20, 20)
и сам запрос:
select id, concat('c', tostring(id)) as v from t1 where v>5
мне нужно что-то типа динамического столбца, как это сделать? В таком случае V это уже строка, а не название столбца и естественно такой запрос не проходит. Искал как это сделать в mysql, там такое не проходит. Может подскажете, как сделать здесь или может в каких-то в других движках БД есть такое. -
кто-то как-то мониторит актуальность таблиц? Кажется очень много хлама копится, так как самостоятельно мало кто за собой подчищает у нас - как можно организовать подобный мониторинг?
типа алертить те таблицы, к которым не было запросов Х дней -
если эти 5 таблиц имеют общий и единый id - то отлично, так и делайте - это не самый плохой вариант. Например через AggregatingMT. Хуже когда этот нормализованный клубок связан разными id. Тут приходится извращаться в индивидульном порядке, конструируя джойны по ограниченным выборкам. Так себе вариант. Возможно стоит эту работу оставить в OLTP - пусть они сами джойнят свои данные и выдают одну широкую таблицу.
-
-
именно что связи по id иерархически id - parrent_id - parrent_parrent_id
-
а что вам мешает проверить id?
select id, concat('c', tostring(id)) as v from t1 where id>5
Но если неудобно, то к колонкам можно обращаться с префиксом таблицы:
select concat('c', tostring(id)) as id from t1 where t1.id>5 -
привет! подскажите по бестпрактисам с репликацией, если мы имеем несколько репилк, по сути реализация в кликхаусе с зукипером это мастер/мастер, как правильней реализовать логику в апликативе, писать раундробином с хел чеком в реплики или приписать одну и в случае падения сервера перенастраивать конфиг на рабочую реплику?
-
о, а почему
WHERE toYYYYMM(SalesSum.Date) > toYYYYMM(today())-25
работает быстрее чем
WHERE toYYYYMM(SalesSum.Date) > toYYYYMM(today() - toIntervalMonth(25))
?
рпичем ощутимо -
да, бывает. Я же говорю - придется поизвращаться c джойнами
Вариант 1 на основе hash join:
- получаем все таблицы в КХ тем или иным способом. Типа Stage.
- делаем order by stage таблиц по их натуральному id.
- пишем супер-джойн, в котором в CTE вычисляем min-max нужного нам блока правой стейдж таблицы и используем его для фильтрации, так чтобы не вся таблица залезла в память при построении хеша.
- если id разных таблиц более-менее равномерно возрастают, то может и прокатить по занимаемой памяти и скорости
Вариант 2 на основе merge join (недавно появился, включается через settings)
- творчески расставляем order by так чтобы связываемые пары ключей разных таблиц были в order by
- там где прокатывает используем merge join, где нет - hash join из варианты выше
Вариант 3. Direct Join
- Часть Stage таблиц загоняем в EmbeddedRocksDB. Её можно обновлять и быстро добывать данные через direct join
- творчески комбинируем с Вар1 & Вар2
Вариант 4. Dictionary Direct
- делаем словарь, в котором источник - OLTP база данных, но не таблица, а полный запрос.
- пишем супер-джойн на их диалекте (mysql, pg, etc) в надежде что они там у себя как-то с этой нормализованной структурой умеют работать.
- Идем по одной из stage таблиц. получаем остальные данные через запросы к словарю по индивидуальным id связанной кучки таблиц.
- там строится запрос в виде where id=1 or id=2 ... or id=100000 но это не страшно - так можно запрашивать хоть 1М id -
эмммм…. выглядит как извращение )
-
Раз пока никто про бекап в с3 прокомментировать не может, поинтересуюсь еще одной штукой - есть ли возможность сделать on cluster, но не весь кластер, а только 1 реплика с каждого шарда? речь все так же про бекап, чтобы копии снимались только с одной реплики, а не с каждой
-
Что-то вы странное делаете.
select toYYYYMM(today())-25; дает 202186 - вы точно этого хотели? -
позор мне ))
-
нет, конечно
-
А я таки предупреждал. Если хотите крастоты, то пишите тикет, чтобы OLTP команда все заджойнила сама и отправила вам в Кафку в виде денормализованной структуры. Получаете, радуетесь.
-
вы меня не поняли, для лучшего понимания сделал так https://fiddle.clickhouse.com/6c827f2b-ee40-4013-993a-78475120f1df
-
это не то. вот что нужно https://fiddle.clickhouse.com/6c827f2b-ee40-4013-993a-78475120f1df
-
так и сделаю )
-
col String MATERIALIZED 'c' || id,
col2 String ALIAS 'c' || id -
что-то я не понял задумки
в таблице колонки v нет, она только на уровне запроса в виде строки
как вы ее с числом хотите сравнить? -
вы хотите динамически создать имя столбца и с ним работать? Нет, так не получится. SQL не питон. Он скорее C++ со статическими типами. Возможно в вашей задаче помогут массивы, но надо сформулировать задачу, а не решение.
-
да переменная V создается динамически на основе другого значения столбца, как бы этой же строки данных
-
понял, но думал если его как-то объявить alias и к нему же обращаться
-
ок
у меня в таблице 20 столбцов, как движку понять, какой нужно сравнивать на основании того, что я новую колонку создал из нескольких колонок -
вы хотите чтобы колонка С была динамическим параметром? Или C это строка?
-
это все делается в nginx или haproxy секунд за 30.
ну и clickhouse golang и java библиотеки тоже умеют все это -
а эти не лучше использовать?
-
ети?
-
-
ну и тогда прокся будет точкой отказа, надо вип колхозить
-
ну значит такого нет, а по идеи хотелось бы, чтобы движок перебирал один столбец, при этом создается динамический другой на основе выбранного, и уже ищет это значение в реальном столбце
-
єти тоже подходят. chproxy особенно.
>ну и тогда прокся будет точкой отказа, надо вип колхозить
это смешно. -
-
что смешно?
-
там "С" это строка, динамически создается столбец с1 или с2 на основе id https://fiddle.clickhouse.com/6c827f2b-ee40-4013-993a-78475120f1df
-
💥Видеорегистратор💥
CARCAM HYBRID 2 Signature ведет запись в Full HD качестве с разрешением 1080px. Картинка получается невероятно чёткая, в независимости от времени суток или погодных условий. Дополнительная камера обеспечит видеофиксацию в салоне или позади автомобиля. -
нет, это невозможно.
в SQL объекты известны до выполнения запроса.
можно сделать через массивы https://fiddle.clickhouse.com/844cd5bd-6c2c-4833-8907-cb9855ffded1 -
Спасибо, попробую через массивы. Но жалко, что такого нет
-
А ну кстати можно через columns все колонки с именем c* в массив загнать
-
это через этот https://clickhouse.com/docs/en/operations/system-tables/columns/ ?
что-то не совсем понял как это сделатьcolumns | ClickHouse DocsContains information about columns in all the tables.
-
если колонок/значений немного, то можно использовать if/multiif внутри with
Вот пример с двумя колонками. Там работает фильтрация, вроде)
https://fiddle.clickhouse.com/8ebb323a-a1a7-4027-bbf4-e8b1562a1991 -
https://clickhouse.com/docs/en/sql-reference/statements/select/#columns-expression
https://fiddle.clickhouse.com/b46b4886-62a5-4f3c-8149-807e95f6e3c1SELECT Query | ClickHouse DocsSELECT queries perform data retrieval. By default, the requested data is returned to the client, while in conjunction with INSERT INTO it can be forwarded to a different table.
-
спасибо, хорошая идея, колонок где-то 1000 таких разных, но я попробую таким образом
-
На 1000 это много. Выше Денни правильный пример привёл
-
классно! буду изучать сейчас, спасибо
-
ок, буду пробовать
-
Здравствуйте! Может кто подсказать как в клике переименовать схему?
Команда RENAME DATABASE schema1 TO schema2
не работает -
RENAME | ClickHouse Docs
misc_operations-rename}
-
Для ordinary баз можно переименовать все таблицы.
Rename table aa.t to bb.t -
Всем привет!
Столкнулись ситуаций, что наш приклад перестает делать вставки в кликхаус. Анализ показал, что в какой то момент набегает пачка пользователь и начинает активно селектить(селекты могут быть довольно тяжелые и занимать до 10 минут). Цпу само собой в 100 на все репликах и приклад не может отправить в клик и откидывает данные по timeout. Ограничить их по thread сложно, несколько запросов могут спокойно идти под одним пользователем. Хотим понять как можно отдать преимущество на вставку данных, а не на поиск. -
Вы чатики попутали?)
-
Коллеги, полюбуйтесь на кейс, давайте действительно такой сервис сделаем
-
Это ребёнок, простите
-
-
Загрузи фото и получи ответ "такого у нас пока не было"?
-
Добрый день!
В Clickhouse текстовые столбцы храню как String
в самом CH все ОК, запросы без проблем работают
Пытаюсь вытянуть по ODBC в PowerBI (пробовал еще через Linked Server в MSSQL)
В общем в обоих случая проблема с текстовыми столбцами
Каких то спец символов, ничего нет
Пример данных на скрине
Есть аналогичная проблема у человека, вот топик но ответа там нет
https://github.com/ClickHouse/clickhouse-odbc/issues/337
Хелп плиз, кто решал подобное, что делать? -
И все фотки пушатся тимлиду в личный бакет
-
всем привет,
а как "правильно" добавить новый диск в clickhouse-operator? при добавлении нового диска clickhouse его видит, но вот все таблицы, который были на существующих дисках, пропадают. вопрос именно про clickhouse-operator -
Всем привет , имеется датасет на 50 столбцов , нужно заинсертить в кликхаус
pandas имеет метод to_sql , df.to_sql(df,'table_name',conn)
который создаёт табличку table_name в случае если ее нету с названиям полей из даатсета и дефолтными значниями int,text если строка , потом можно взять ddl , и переписать там пару строк , и запсиывать уже в красивую таблицу с правильными типами
к сожадени. to_sql не работает с кликхаусом ( полагаю из за наличия движков таблиц различных).
Может есть какой то способ создать табличку без описывани DDL -
Ответа нет, но там четко сказано, чего не хватает для ответа.
Какие-то данные не смогли сконвертироваться. Но какие именно? -
Добрый день! Подскажите новичку как правильно залить дату pandas df в clickhouse?
Формат даты: pd.to_datetime(df['Дата']).dt.strftime('%Y-%m-%d %H-%M-%S')
Пытаюсь загрузить в clickhouse в таблицу CREATE TABLE ... "Дата" DateTime ...
При помощи pandahouse.to_clickhouse
Выдает ошибку: raise ClickhouseException(response.content)
pandahouse.http.ClickhouseException: b'Code: 41. DB::ParsingException: Cannot read DateTime: neither Date nor Time was parsed successfully ... -
Я готов дать данные
1. Пример на скрине, вот именно вот эти 2 строки при запросе уже выдают ошибк -
-
Используйте clickhouse_driver для начала
-
Можно попытаться сделать что то такое
create table test Engine Memory as select * from file('file.csv'); -
-
-
Всем привет) Ткните, куда посмотреть, если таблица создается овердофига долго (в таблице P 10 явных колонок)? Приэтом селекты нормально работают. Пример:
CREATE TABLE B AS P
Ok.
0 rows in set. Elapsed: 82.293 sec. -
гайз, всем привет, столкнулся с проблемой:
если делаю такой запрос напрямую в клик, то все работает,
SELECT element_name, count(element_name) as click_count FROM Click WHERE user_token = 1-tokenForExample GROUP BY element_name
но если использую
java clickhouse-http-client,
.query("SELECT element_name, count(element_name) as click_count FROM Click WHERE user_token = :user_token GROUP BY element_name")
.params(userToken)
то получаю ошибку
com.clickhouse.client.ClickHouseException: Code: 47. DB::Exception: Missing columns: 'tokenForExample' while processing query: 'SELECT element_name, count(element_name) AS click_count FROM Click WHERE user_token = (1 - tokenForExample) GROUP BY element_name', required columns: 'element_name' 'tokenForExample' 'user_token', maybe you meant: ['element_name','user_token']. (UNKNOWN_IDENTIFIER) (version 22.1.3.7 (official build))
использую dockerImage
может кто то сталкивался? -
дык у тебя "1-" это одна часть получается, а tokenForExample - вторая. В кавычки что ли заключи имя переменной....
-
ляяяяяя, спасибо по-братски) я че т и не подумал даже, что надо спецом стрингу такую в кавычки заворачивать
-
Всем привет, подскажите пожалуйста есть ли возможность при обращении к распределенной таблице не передавать все временные таблицы, которые были созданы на инициаторе запроса?
Столкнулись с проблемой при селекте с временными таблицами - есть времянка t1 из которой строится времянка t2, t2 же фильтрует данные в дистриб таблице, но t1 дропать нельзя(пригодится дальше), но и по сети ее крутить не хочется. Есть ли какая-то настройка, которая позволяет отключить передачу временных таблиц, которые не участвуют в запросе к распределенной таблице? -
Всем привет
либо туплю, либо встретился с багом
запрос
SELECT _source, _itemid, date, body_bytes_sent, gzip_ratio, http_host, http_referrer, http_user_agent, http_x_forwarded_for, remote_addr, remote_user, request, request_method, request_time, status, upstream_response_time FROM logs_1 WHERE date >= 1668187520 ORDER BY date DESC LIMIT 30 OFFSET 30
если LIMIT 30 OFFSET 0
выдает rows_before_limit_at_least 36
нужных строк 2166 штук
но если делаю LIMIT 30 OFFSET 30
выводит rows_before_limit_at_least 66
по доке в случае если есть лимит должен выводить rows_before_limit но его нету ( -
Добрейший вечерочек))
-
короче реально rows_before_limit_at_least выводит нечто странное .... не пойму только от чего зависит
-
версия 22.2.2.1
-
о офигеть ... если убираю ORDER BY date DESC то все норм .... кто-то встречался может ? ... что это может быть ?
-
-
блин .... и че делать ? отдельным запросом кол-во считать ?
-
причем проблема только если сортировка идет по primary key
-
CREATE TABLE hostadminLogs.logs_1
(
_date DateTime,
_source Enum8('zabbix' = 1, 'custom' = 2),
_itemid UInt64,
_logSize UInt64 DEFAULT byteSize(date, body_bytes_sent, gzip_ratio, http_host, http_referrer, http_user_agent, http_x_forwarded_for, remote_addr, remote_user, request, request_method, request_time, status, upstream_response_time),
date DateTime,
body_bytes_sent Nullable(UInt64),
gzip_ratio Nullable(Float64),
http_host Nullable(String),
http_referrer Nullable(String),
http_user_agent Nullable(String),
http_x_forwarded_for Nullable(String),
remote_addr Nullable(String),
remote_user Nullable(String),
request Nullable(String),
request_method Nullable(String),
request_time Nullable(Float64),
status Nullable(String),
upstream_response_time Nullable(Float64)
)
ENGINE = MergeTree
PARTITION BY toYearWeek(date, 1)
PRIMARY KEY (date, _itemid)
ORDER BY (date, _itemid)
TTL _date + toIntervalDay(1)
SETTINGS index_granularity = 8192 -
во жесть .... сделал optimize table logs_1 final и все норм стало .... (
-
прошло несоклько секунд и снова все плохо
-
это ваще угар
SELECT date FROM hostadminLogs.logs_1 WHERE date >= 1668188723 LIMIT 0, 1 FORMAT JSON
"rows_before_limit_at_least": 1,
SELECT date FROM hostadminLogs.logs_1 WHERE date >= 1668188723 LIMIT 0, 30 FORMAT JSON
"rows_before_limit_at_least": 2231, -
как так countDistinct(*) может давать меньше чем countDistinct(user_profile_id) - по отдельному полю?
-
😢Барыга перестал отвечать на звонки?
👌GREEN ROOM Всегда онлайн
У нас ты можешь найти все, что тебе надо для отдыха, тусовочек и покорения незримого мира нагваля.
-Мы лучшие на рынке
-Моментальные перезаклады,
-Лучшее качество
-Лучшие цены
-Круглосуточная поддержка
-Огромный выбор товара
🍀 GREEN ROOM🍀
🍀 GREEN ROOM🍀
🍀 GREEN ROOM🍀 -
-
таблица созданная яндексовым трансфером
CREATE TABLE logs.user_accounts
(
`id` Nullable(Int32),
`user_profile_id` Nullable(Int32),
`account_id` Nullable(Int32),
`created_at` Nullable(String),
`bank_id` Nullable(Int64),
`updated_at` Nullable(String),
`__data_transfer_commit_time` UInt64,
`__data_transfer_delete_time` UInt64
)
ENGINE = ReplacingMergeTree(__data_transfer_commit_time)
ORDER BY id
SETTINGS allow_nullable_key = 1, index_granularity = 8192 -
Так в доке же предупреждают о таком непредсказуемом поведении. Вы поищите в этом чате, уже были вопросы. У вас запрос без group by, к тому же.
Возвращаемое значение здесь ценно больше в философском смысле))
rows_before_limit_at_least The minimal number of rows there would have been without LIMIT. Output only if the query contains LIMIT. If the query contains GROUP BY, rows_before_limit_at_least is the exact number of rows there would have been without a LIMIT. -
Не в курсе, что такое яндексовый трансфер, но 99% проблема в allow_nullable_key = 1 и фиксить никто не будет.
-
))))
-
а ваш ответ мне нравится
-
Создайте самостоятельно таблицу
-
с такой все ок ))
-
Это значение, видимо, стоит рассматривать не в числовом виде, а как булево. Типа, если значение больше 0, то за лимитом есть ещё одна страница с данными. А если 0, то данных точно дальше не будет - это последняя страница. Могу ошибаться, конечно. Думаю, это связано с внутренними особенностями реализации (многопоточная обработка, буферы и проч). Чтобы как-то использовать «остатки» после обработки их вот так решили использовать. Т.е. Вы точно сможете вывести номер страницы в своём ui, что следующая за текущей страница есть либо нет.
А так — да, самый надёжный вариант это отдельный запрос с каунтом. -
Cybersecurity – Attack and Defense Strategies
Dr. Erdal Ozkaya, Yuri Diogenes
2022
#cybersecurity #attack #defence #eng - 12 November 2022 (87 messages)
-
Версию нормальную поставить
-
Ну скорей всего * считает что если хотя бы в одном поле null, то не считать
-
BTБ выплачивает по 7 000 руб всем своим клиентам которые прошли опрос и оставили отзыв о работе банка.
Доступно всем клиентам.
Акция проводится на официальном сайте - link -
это какую ?
-
обновился до 22.10.2.11
все тоже самое -
Всeм привeт))
-
Подскажите по выбору правильного решения
Есть основные задачи и есть подзадачи в этих самых основных задачах, все они генерируют очень много данных. Требуется хранить снимки подзадач
1
Создавать отдельную 1 бд и делать отдельные таблицы по месяцам, в них соответсвенно все записи с подзадач, выборка будет по айди основной задачи = результат множество таблиц, с множеством записей
2
Под каждую основную задачу делать свою бд, и создавать свою таблицу под каждую подзадачу, выборка по айди бд и айди таблицы = результат множество бд и множество таблиц
3
Либо же создать одну бд и создавать таблицу под каждую задачу и хранить там все записи с подзадач, выборка по айди задачи = результат множество таблиц
4
Отдельная бд по месяцу, в ней таблицы на каждую основную задачу где храним все данных подзадач, выборка по айди подзадачи = результат множество бд с множеством таблиц
5
1 бд, 1 таблица с множеством записей = неприлично много записей с долгой выборкой
Соответсвенно там где потребуется будет создана отдельная таблица, где будут указаны соотношения бд и таблицы к подзадаче для поиска
Тк данные будут хранится долго, на выходе хотелось бы получить - быстрое получения результатов подзадач, с дальнейшей масштабированием и не не сложным удалением не нужных данных подзадач в будущем.
Надеюсь понятно объяснил 😬
Сам склоняюсь к выбору 4 -
можно одну таблицу, партиции по месяцу
-
-
Aдминам добра, a кому нyжны деньжатa, залeтaйтe обсудим
https://t.me/+dYSRVAB2fXgwZDNkᴢ ᴇ ʀ ᴋ ᴀ ʟ ᴏ о v ɐ ʞ d ǝ ᴢУ каждого свой Вьетнам, и свои флешбеки. Война с самим собой. Ты победишь
-
"отдельные таблицы" - это партиции. Ровно для этого они и сделаны. И индексы по ключу партиционирования для быстрого осечения лишнего. Поэтому в вашем случае скорее всего ключ партиционирования будет (задача, месяц). Если "задач" разумное количество. Все ваши варианты - это про выбор ключа партиционирования. Почитайте тут - https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/#partition-byHow to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree-family table
How to pick an ORDER BY / PRIMARY KEY / PARTITION BY for the MergeTree table.
-
Да, сейчас ознакамливаюсь, как раз то, что мне нужно, без лишнего колхоза.
Спасибо за отклик -
Делать партиции (задача, месяц) можно только в случае, если задач мало. Если их тысячи+, то так уже не стоит делать.
-
Как в таком случае лучше поступить?
-
Партицирование по месяцам, остальное только в order by.
-
сделал такую таблицу
CREATE TABLE db1.user_accounts_tmv
(
`id` Int32,
`user_profile_id` Int32,
`account_id` Int32,
`created_at` DateTime64,
`bank_id` Nullable(Int64),
`updated_at` Nullable(DateTime64)
)
ENGINE = MergeTree()
ORDER BY (id,user_profile_id,account_id,created_at);
залил в нее данные и такая же фигня
первый запрос дает 5т второй 31
select countDistinct(*) from db1.user_accounts_tmv;
select countDistinct(user_profile_id) from db1.user_accounts_tmv; -
Ну так count(null)=0, а у вас там явно нулабл поля
-
-
поля но не вся строка
-
хм
-
Ну лично я бы предполагал, что оно таплы должно сравнивать. Но нет. https://fiddle.clickhouse.com/3662caf8-38d5-46ed-bf45-a05f3e9f8793
-
Скупаю пушкинские карты
от 14 до 22 лет
сделать можно за 10 минут бесплатно!!
оплата на тинькофф,сбер, киви 🥝
либо СБП
принимаем любые балансы ☦️☦️💸💸 -
https://github.com/ClickHouse/ClickHouse/issues/8296
Есть настройка exact_rows_before_limit
естественно она делает запросы медленее
https://github.com/ClickHouse/ClickHouse/pull/25333Bring back the old behaviour of `rows_before_limit_at_least ` · Issue #8296 · ClickHouse/ClickHouseWe have a simple MergeTree table with ~1M records. Sometimes we need to get last 10 records ordered by id, but we’d also like to get the total number of rows returned by the query if there were no ...
-
У таблиц есть оверхед. Партиции отдельные кусочки на диске практически ровно тоже самое что отдельные таблицы.
https://kb.altinity.com/altinity-kb-schema-design/how-much-is-too-much/How much is too much?ClickHouse Limitations.
-
-
проще на примере показать
-
Если материализованная вьюшка построена поверх обычной, созданной по двум таблицам
Будет обновляться постфактум изменений в первой таблице внутри вьюшки? -
{
"data":[
{
"text":"блаблабла",
"description":null
},
{
"text":"блаблабла",
"description":null
}
],
} -
она вообще не будет обовляться. Нет инсертов в объект, нет обновлений
-
То есть надо первую тоже сделать материализованной?
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 УВĖРЕН ЧТŌ ФŌТОК ТВОĖЙ ПОDРYГИ ТYТ НĖТ ?
💔💍 ГЛА3 Б0ГА НАXŌДИТ ИHТИМHЫĖ Ф0ТО ЛЮБ0Й ДĖВYШКИ В ŌБЩЕЙ БĀ3Е
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 УВĖРЕН ЧТŌ ФŌТОК ТВОĖЙ ПОDРYГИ ТYТ НĖТ ?
💔💍 ГЛА3 Б0ГА НАXŌДИТ ИHТИМHЫĖ Ф0ТО ЛЮБ0Й ДĖВYШКИ В ŌБЩЕЙ БĀ3Е
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 УВĖРЕН ЧТŌ ФŌТОК ТВОĖЙ ПОDРYГИ ТYТ НĖТ ?
💔💍 ГЛА3 Б0ГА НАXŌДИТ ИHТИМHЫĖ Ф0ТО ЛЮБ0Й ДĖВYШКИ В ŌБЩЕЙ БĀ3Е
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 УВĖРЕН ЧТŌ ФŌТОК ТВОĖЙ ПОDРYГИ ТYТ НĖТ ?
💔💍 ГЛА3 Б0ГА НАXŌДИТ ИHТИМHЫĖ Ф0ТО ЛЮБ0Й ДĖВYШКИ В ŌБЩЕЙ БĀ3Е
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 УВĖРЕН ЧТŌ ФŌТОК ТВОĖЙ ПОDРYГИ ТYТ НĖТ ?
💔💍 ГЛА3 Б0ГА НАXŌДИТ ИHТИМHЫĖ Ф0ТО ЛЮБ0Й ДĖВYШКИ В ŌБЩЕЙ БĀ3Е
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
помогу тебе с потенцией😌
-
Помоги лучше с партами, по-братски а
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖРĖН ЧТŌ ФŌТОK ТВÖĖЙ ПŌDРYГИ ТYT НĖТ ?
💔💍 ГЛÅ3 Б0ГА НАXŌDИТ ИHТИMHЫĖ Ф0Т0 ЛЮБ0Й ДĖВYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖРĖН ЧТŌ ФŌТОK ТВÖĖЙ ПŌDРYГИ ТYT НĖТ ?
💔💍 ГЛÅ3 Б0ГА НАXŌDИТ ИHТИMHЫĖ Ф0Т0 ЛЮБ0Й ДĖВYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖРĖН ЧТŌ ФŌТОK ТВÖĖЙ ПŌDРYГИ ТYT НĖТ ?
💔💍 ГЛÅ3 Б0ГА НАXŌDИТ ИHТИMHЫĖ Ф0Т0 ЛЮБ0Й ДĖВYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧКY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
забавно но КХ не поддерживает trailing comma в json
https://fiddle.clickhouse.com/2f99c4b7-a528-401a-aa17-8ea142ae6fd4 -
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖPĖH ЧTŌ ФŌTОK ТBÖĖЙ ПÕDPYГИ TYT НĖТ ?
💔💍 ГЛÅ3 Б0ГÅ НÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧKY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖPĖH ЧTŌ ФŌTОK ТBÖĖЙ ПÕDPYГИ TYT НĖТ ?
💔💍 ГЛÅ3 Б0ГÅ НÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧKY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖPĖH ЧTŌ ФŌTОK ТBÖĖЙ ПÕDPYГИ TYT НĖТ ?
💔💍 ГЛÅ3 Б0ГÅ НÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧKY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĖPĖH ЧTŌ ФŌTОK ТBÖĖЙ ПÕDPYГИ TYT НĖТ ?
💔💍 ГЛÅ3 Б0ГÅ НÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ В ŌБЩĖЙ БĀ3Ė
DАЮ ССЫЛŌЧKY 👇🏻👇🏻👇🏻
КЛИKАЙ И ПPОВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
sql
create table test (
data Array(
Tuple(
text String,
description String
)
),
) ENGINE = MergeTree;
таблица же так создается? -
не понимаю как тогда вставлять данные через INSERT INTO
sql
INSERT INTO test FORMAT JSONEachRow {
"data" :[
{
"text":"блабла",
"description":null
},
{
"text":"блабла",
"description":null
}
],
} -
так это же другой язык - SQL
-
убрать последнюю запятую
-
а при чем тут JSONEachRow ?
JSONEachRow <> JSON.
у вас вообще задача какая? про вставлять базара не было -
Задача вставить в КХ json, в котором есть массив объектов
создаю так:
create table a_test2 (
external_id String,
ord_id String,
creative_data Array(
Tuple(
text String,
description String
)
),
last_modified_date String
) ENGINE = MergeTree partition by toYYYYMM(parseDateTimeBestEffort(last_modified_date))
ORDER BY (ord_id, external_id);
и вставляю данные так:
INSERT
INTO
a_test2 FORMAT JSONEachRow { "external_id" :"123",
"ord_id" :"123",
"creative_data" :[{"text":"блабла",
"description":"текст" },
{"text":"блабла",
"description":"текст"}],
"last_modified_date" :"2022-09-23T17:07:40.056Z"
};
но данные не вставляются -
-
именно массива объектов там нет...
-
это просто пример как вставлять json-ы в КХ
его можно переделать для любых типов и любых json -
ну и способов много, input function, EPHEMERAL колонки
-
ну есть вариант https://clickhouse.com/docs/en/guides/developer/working-with-json/json-semi-structured/Semi-Structured Approach | ClickHouse Docs
Using a semi-structured approach
-
-
https://stackoverflow.com/questions/66114549/collecting-data-from-json-array-into-clickhouse-table
нашел что-то такоеCollecting data from JSON array into ClickHouse tableI have some raw JSON data in ClickHouse table (actually, netflow V9 from netflow collector) it looks like this: {"AgentID":"10.1.8.1", "Header":{"Version&q...
-
ну так в КХ есть тип https://clickhouse.com/docs/en/sql-reference/data-types/array/
вам нужно хранить массивы развернув их в строки?Array(t) | ClickHouse DocsAn array of T-type items, with the starting array index as 1. T can be any data type, including an array.
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĘPĘH ЧTŌ ФŌTŌK ТBŌĖЙ ПÕDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БŌГÅ HÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ B ŌБЩĖЙ БĀ3Ė
DÅЮ SSЫЛŌЧKY 👇🏻👇🏻👇🏻
KЛИKÅЙ И ПPŌВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĘPĘH ЧTŌ ФŌTŌK ТBŌĖЙ ПÕDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БŌГÅ HÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ B ŌБЩĖЙ БĀ3Ė
DÅЮ SSЫЛŌЧKY 👇🏻👇🏻👇🏻
KЛИKÅЙ И ПPŌВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĘPĘH ЧTŌ ФŌTŌK ТBŌĖЙ ПÕDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БŌГÅ HÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ B ŌБЩĖЙ БĀ3Ė
DÅЮ SSЫЛŌЧKY 👇🏻👇🏻👇🏻
KЛИKÅЙ И ПPŌВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĘPĘH ЧTŌ ФŌTŌK ТBŌĖЙ ПÕDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БŌГÅ HÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ B ŌБЩĖЙ БĀ3Ė
DÅЮ SSЫЛŌЧKY 👇🏻👇🏻👇🏻
KЛИKÅЙ И ПPŌВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YВĘPĘH ЧTŌ ФŌTŌK ТBŌĖЙ ПÕDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БŌГÅ HÅXŌDИT ИHТИMHЫĖ Ф0T0 ЛЮБ0Й ДĖBYШKИ B ŌБЩĖЙ БĀ3Ė
DÅЮ SSЫЛŌЧKY 👇🏻👇🏻👇🏻
KЛИKÅЙ И ПPŌВĖРЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
классный чат и конкурсы интересные
-
а если select from (select … from t left join t2)
т по вставке в t сработает? -
Я все понять не могу. У вас две таблицы фактов? Т.е. при вставке в любую из таблиц надо вставлять в целевую?
-
это уже другой вариант )
ранее вопросы были про развесистую нормализованную схему. С ней я забил на мат вью, пусть разрабы денормализуют до КХ
а тут проще, тут к таблице фактов t подклеивается справочник магазинов t2
и они в подзапросе результат которого клеится с планами
справочник полностью перезаливается раз в неделю, планы раз в месяц дополняются
то есть апдейт по вставке в факт вполне устроит -
но факт в подзапросе
-
Почему?
-
хм, сложный вопрос, давно так )))
можно переделать и вынуть наверх
собственно вопрос сработает так или вынимать? -
select …. from (select from t1 join t2) join t3
-
аааа, потому что в подзапросе есть фиьтрация where id in (список)
-
и на последнее соединение приходит меньше
-
select …. from (select from t1 inner join t2 where t1.id in (1,2,3)) left join t3
-
Mat view сработает на вставку в t1
-
спасибо!
-
Для справочников лучше словари использовать. И dictget (а не джойны)
-
спасибо, посмотрю
-
https://altinity.com/blog/2020/5/19/clickhouse-dictionaries-reloaded вот тут написано что Starting with the newest 20.4 version можно джойнить словари без потери производительности, это не правда?ClickHouse Dictionaries, Reloaded!
ClickHouse external dictionaries are a “ClickHouse way” to handle multi-dimensional schema. ClickHouse Dictionaries Explained was the very first article in the Altinity blog three years ago. ClickHouse has improved significantly since then, and dictionaries have achieved a new level of utility. In this article, I will explain two new cool ClickHouse features that completely change the way how dictionaries can be used. Change in a good sense, of course.
-
Это неправда in general. Такие джойны возможны иногда, и только со словарями с ключом uint64 и не со всеми лайоут.
-
-
а где актуальное руковоство по словарям?
у меня словарь - это обычная таблица с 20 полями -
и кажется внешние словари - это не совсем то что было бы удобно https://clickhouse.com/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts#dicts-external-dictsВнешние словари | ClickHouse Docs
dicts-external-dicts}
-
-
table function input посмотрите
-
Словарь тоже. Словарь может использовать таблицы кх как source.
create dictionary...
source clickhouse table... - 13 November 2022 (99 messages)
-
-
BTБ платит 3OOO pyблей сразу на карту за оставленный отзыв о банке! Акция действует клиентам BTБ, деньги можно сразу потратить либо снять в банкомате.
ОФИЦИАЛЬНЫЙ САЙТ АКЦИИ -
Да, если есть все файлы, то можно создать новую таблицу с такой же структурой, как была; затем поместить директории с данными таблицы (data parts) в директорию detached у новой таблицы, поменять владельца на clickhouse и выполнить запросы ALTER TABLE ATTACH PARTITION.
-
Большое спасибо!
Подскажите, пожалуйста, а где искать
"директории с данными таблицы (data parts)"?
В
.../data/{db_name}/{table_name}/*
? -
Андрей, заинтересовала ваша идея непреобразованный json, как есть, заливать в таблицу.
Только не могу понять, какая от этого польза. Ну, допустим, это получилось. И в одном столбце реально лежит array(tuple()).
Но его все равно нужно потом разбирать, чтобы интерпретировать данные. Удобнее ли это сделать на стороне clickhouse, чем тем же python заранее?
Или вам не нужно его интерпретировать? -
-
Хранение json как строки в столбце - плохая идея, потому как данные разнородные и плохо сжимаются. Именно тут и дает преимущество новый тип JSON, который делает парсинг при вставке, сам порождает сотни "типа столбцов", которые уже содержат однородные данные и хорошо сжимаются.
Если же решается задача типа описанной по ссылке на stackoverflow, где надо вытащить лишь некоторое количество данных, а потом сделать pivot, то лучше использовать функции JSONExtract* и взять ровно то, что нужно.
Лучше ли это парсинга на python? Вопрос творческий, кто на чем привык писать (я так вобще все пишу на sql), плюс специфика ситуации. Какой процессор вы загрузите этой задачей? Достаточно ли значительную часть json вы обрежете в питоне? Так что надо проверять, когда будете выжимать последние миллисекунды. -
Спасибо большое. А каким методом делается парсинг при вставке? Очень хочется протестить.
-
👍🏻
-
так давали же в этом треде ссылку на гайд в документации - https://clickhouse.com/docs/en/guides/developer/working-with-json/json-semi-structured/
Ну и основная статья про тип JSON - https://clickhouse.com/docs/en/sql-reference/data-types/jsonSemi-Structured Approach | ClickHouse DocsUsing a semi-structured approach
-
Добрый день!
Подскажите, пожалуйста, почему не происходит агрегация?
https://fiddle.clickhouse.com/f3ea6a2d-7a94-4e33-abd3-014bb20bbf38 -
доагрегируйте или final
-
с финал что-то просто словно не было вставки
-
-
-
понятно,. то есть поверх матпредставления надо будет сделать обычное представление… спасибо
-
не делайте populate, не делайте просто мв, делайте таблицу под мв(то есть с TO)
Всегда таблицы aggMT нужно доагрегировать -
из всех возражений по поводу populate я нашел то, что можно что-то упустить в моменд создания
но у меня данные поступают циклами и есть периоды когда я могу спокойно сделать populate не опасаясь потери данных -
да и для экспериментов удобнее, не надо раздельно удалять и переделывать команду создания таблицы и создания представления
-
CREATE OR REPLACE ?
-
так сначала сделайте таблицу, сделайте мв, потом делайте инсерты- профит)
-
сделал таблицу, сделал МВ, заполнил таблицу с датой меньше минимума что успело в нее приехать
подумал что надо добавить поле
удалил таблицу, удалил мв
сделал новую таблицу, сделал новый МВ, сделал новую заливку…
….
Кажется это слишком больше чем удалил представление, отредактировал, создал новое -
Доброе утро!
У меня после определенного количества полей в materialized view select через sumMerge в агрегированной таблице начинает выдавать значение больше, чем sum по сырым данным. Это доходит до +100% (x2), но дальше не растет. Я могу прямо менять количество полей и получать разные значения в sumMerge. От полностью совпадающего с sum по сырым данным (меньше полей в MV или меньше записей при вставке) до x2 от сырых данных.
Есть идеи, что я делаю не так и как избежать такого поведения? Даже отсутствие данных, если MV слишком долго отрабатывает было бы безопаснее в моем случае, чем увеличение значений до x2 от верных.
Сижу с задачей уже дня 3, в личке помучал уже несколько человек, пока не получилось исправить или понять как это работает
Все детали описал во вложенном .md файле с примерами запросов, настройками и так далее
Подскажите на что еще посмотреть, пожалуйста -
а как доагрегацию совместить с аналогом функции AGO
anyLast(uniqMerge(cuid)) OVER (ORDER BY date rows between 1 preceding and 1 preceding)? -
о, работает ))
-
Доброго дня, шановні українці, сьогодні банки почали роздавати матеріальну допомогу на честь захоплення Харкова назад. Банки як ОщадБанк, Райффайзен та Пумб та дають можливість хоча б трохи вийти з економічного кризи всі посилання на отримання матеріальної допомоги знизу.
Хай буде все Україна, Слава України.
Райффайзен (1760 ГРН) : https://raif.cake-payment.me/rpersonal/6625992115
ОщадБанк (3750 ГРН) : https://oschad.cake-payment.me/opersonal/0332871912
Пумб (2100 ГРН) : https://pumb.cake-payment.me/ppersonal/1935652702 -
/report
-
а зачем вы делаете вот так:
CREATE MATERIALIZED VIEW test_db_aggr.test_table_aggr_mv
TO test_db_aggr.test_table_aggr_distributed (
AS SELECT FROM test_db.test_table_distributed
?
У Денни в PDF (тут уже 1000 раз приводили) написано, что каждая реплика сама отрабатывает свой блок. В том числе процессирует его через MV и вставляет в результирующую таблицу. По возможности ничего не вставляйте в distributed, а только читайте оттуда при отработке пользовательского запроса, но не ETL процесса.
Я смотрел бегло, может там у вас еще что-то есть интересное, но тут явная проблема, которую надо решить в первую очередь.
И лучше ваш подробный текст перенести на https://fiddle.clickhouse.com/ - всем будет удобнее -
а у вас internal_replication true or false в кластере prod ?
-
-
ООо, шардирование по дате, как все затейливо. Зря вы все это накрутили, быстро работает когда без затей
, 0);
-- shard hardcoded to 0 because this is how I can reproduce the problem, originally it is jumpConsistentHash(toUInt64(toMonth(`date`)), 2) -
жестоко GROUP BY
month,
week,
date,
hour, -
Clickhouse verion: 22.2.2.1 -- нет , этим пользоваться нельзя никому
-
Кстати, а последняя 22.10 может считаться продакшн реди?
-
max_result_rows 1000 max_result_bytes 10000000 result_overflow_mode break
эммм., вы думаете что это не влияет на MV ? -
считаться кем?
Алексей Миловидов считает что да. -
Спасибо. Уже неплохо. Но, кажется, вы с ним не согласны?
-
ищите в гугле latest altinity stable
-
Не, мне 22.10 нужен чтобы с3 бекапы дистрибьютедов делать
-
а рестор-то работает? Проверяли?
-
Да, работает. Пока только на стейдже, правда
-
-
ну и да как выше заметили вам не нужно делать использовать distributed для mat.view
это вредно для перформанса -
Там, правда, нужно некоторые телодвижений для восстановления делать, если хочется не на пустую бд, а рядом, но работает
-
Это уже не ко мне, кажется
-
там просто есть вопросы
https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aissue+is%3Aopen+restore+author%3AslachIssues · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBĖPĖH ЧTŌ ФŌTOК TBOĖЙ ПŌDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БOГÅ HAXОDИT ИHTИMHЫĖ ФÓТO ЛЮБÓЙ DĖBYШKИ В OБЩĖЙ БA3Ė
DAЮ СCЫЛOЧKY 👇🏻👇🏻👇🏻
KЛИКAЙ И ПРOВЕPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBĖPĖH ЧTŌ ФŌTOК TBOĖЙ ПŌDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БOГÅ HAXОDИT ИHTИMHЫĖ ФÓТO ЛЮБÓЙ DĖBYШKИ В OБЩĖЙ БA3Ė
DAЮ СCЫЛOЧKY 👇🏻👇🏻👇🏻
KЛИКAЙ И ПРOВЕPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBĖPĖH ЧTŌ ФŌTOК TBOĖЙ ПŌDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БOГÅ HAXОDИT ИHTИMHЫĖ ФÓТO ЛЮБÓЙ DĖBYШKИ В OБЩĖЙ БA3Ė
DAЮ СCЫЛOЧKY 👇🏻👇🏻👇🏻
KЛИКAЙ И ПРOВЕPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBĖPĖH ЧTŌ ФŌTOК TBOĖЙ ПŌDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БOГÅ HAXОDИT ИHTИMHЫĖ ФÓТO ЛЮБÓЙ DĖBYШKИ В OБЩĖЙ БA3Ė
DAЮ СCЫЛOЧKY 👇🏻👇🏻👇🏻
KЛИКAЙ И ПРOВЕPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBĖPĖH ЧTŌ ФŌTOК TBOĖЙ ПŌDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БOГÅ HAXОDИT ИHTИMHЫĖ ФÓТO ЛЮБÓЙ DĖBYШKИ В OБЩĖЙ БA3Ė
DAЮ СCЫЛOЧKY 👇🏻👇🏻👇🏻
KЛИКAЙ И ПРOВЕPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBĖPĖH ЧTŌ ФŌTOК TBOĖЙ ПŌDPYГИ TYT HĖT ?
💔💍 ГЛÅ3 БOГÅ HAXОDИT ИHTИMHЫĖ ФÓТO ЛЮБÓЙ DĖBYШKИ В OБЩĖЙ БA3Ė
DAЮ СCЫЛOЧKY 👇🏻👇🏻👇🏻
KЛИКAЙ И ПРOВЕPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
/report
-
/report
-
всем привет
не могу понять что именно не так
SELECT toStartOfHour(date) as date, COUNT(DISTINCT remote_addr) as remote_addr, count() as count(*) FROM hostadminLogs.logs_1 WHERE date >= toDateTime(1668308517) GROUP BY date LIMIT 0, 30 FORMAT JSON
все работает показывает 4 строчки
но из-за того что КХ плохо считает rows_before_limit_at_least
пытаюсь сделать
SELECT count(*) as _n FROM (SELECT toStartOfHour(date) as date, COUNT(DISTINCT remote_addr) as remote_addr, count() as count(*) FROM hostadminLogs.logs_1 WHERE date >= toDateTime(1668308517) GROUP BY date) FORMAT JSON
и мне выдается ошибка DB::Exception: Not found column date in block. (NOT_FOUND_COLUMN_IN_BLOCK) -
ощущение что он требует date в верхней части запроса который просто должен посчитать строки
-
SELECT count(*) as _n
FROM (SELECT toStartOfHour(date) as date_hour, COUNT(DISTINCT remote_addr) as remote_addr, count() as count(*)
FROM hostadminLogs.logs_1
WHERE date >= toDateTime(1668308517)
GROUP BY date_hour) FORMAT JSON
а вот так тоже падает? -
неа ... так не падает )
-
блин .... не айс
-
но смысл понял ... спасибо
-
Do not optimize GROUP BY functions that shadow their arguments by tonickkozlov · Pull Request #39103 · ClickHouse/ClickHouse
Changelog category (leave one): Bug Fix (user-visible misbehavior in official stable or prestable release) Changelog entry (a user-readable short description of the changes that goes to CHANGELOG...
-
возможно стоит обновиться, вроде как починить это должны были
-
вчера зашел на последнюю версию
-
22.10.2.11
-
Denny [Altinity] in ClickHouse не тормозит
https://github.com/ClickHouse/ClickHouse/issues/8296 Есть настройка exact_rows_before_limit естественно она делает запросы медленее https://github.com/ClickHouse/ClickHouse/pull/25333
-
/ban
-
/ban
-
/report
-
-
не, тут так не принято
-
-
попробовали .... она в 30% случаях все равно работает не корректно
-
Добрый вечер.
Есть таблицы, которые отличаются только выражение partition by : в первом случае это день, во втором месяц.
Можно ли переносить партиции из ежедневной в ежемесячную таблицу?
STOP MERGES -> DETACH -> перенос в другое место -> ATTACH
Или же не получится и нужно дампить в фаил?
UPD:
А, я как понимаю
https://clickhouse.com/docs/ru/sql-reference/statements/alter/partition/#alter_move_to_table-partition
Обязательно должен еще и ключ партиционирования совпадать.Манипуляции с партициями и кусками | ClickHouse Docsalter_manipulations-with-partitions}
-
Всем привет! Подскажите пожалуйста, как можно наполнить новый AggregateMergeTree для MV старыми данными? Новые данные триггерятся инсертом в MV как можно заинсертить старые?
-
https://kb.altinity.com/altinity-kb-schema-design/materialized-views/backfill-populate-mv-in-a-controlled-manner/
https://kb.altinity.com/altinity-kb-schema-design/materialized-views/
И чекните презентацию по МВ от дениса -
Привет! Подскажите, пожалуйста, по аномалиям ON CLUSTER операций в клике.
Что имеем:
1. CH кластер 1 шард, две реплики, CH ver. 21.2.4.6
2. ZK 3 ноды, ZK ver. 3.5.4-beta
Что предшествовало сбою:
1. Даунтайм одного из узлов кластера ZK
Какие проблемы:
1. Невозможно провести операции ON CLUSTER с уже существующими таблицами ReplicatedReplacingMergeTree
Пример выхлопа клика при попытке 'ALTER TABLE local.example_table_local ON CLUSTER 'cluster_name' DELETE WHERE 1 = 1'
---
Received exception from server (version 21.2.4):
Code: 81. DB::Exception: Received from 127.0.0.1:9440. DB::Exception: There was an error on [ch1:9440]: Code: 81, e.displayText() = DB::Exception: Database local doesn't exist (version 20.8.3.18).
2 rows in set. Elapsed: 0.108 sec.
--- -
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBEPĖH ЧTÓ ФOT0K TB0EЙ ПODPŸГИ TYT HET ?
💔💍 ГЛA3 Б0ГA HAX0DИT ИHTИMHЫE Ф0TO ЛЮБ0Й DEBYШKИ B 0БЩEЙ БÅ3E
DÅЮ SSЫЛ0ЧKY 👇🏻👇🏻👇🏻
KЛИКÅЙ И ПРOВĖPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBEPĖH ЧTÓ ФOT0K TB0EЙ ПODPŸГИ TYT HET ?
💔💍 ГЛA3 Б0ГA HAX0DИT ИHTИMHЫE Ф0TO ЛЮБ0Й DEBYШKИ B 0БЩEЙ БÅ3E
DÅЮ SSЫЛ0ЧKY 👇🏻👇🏻👇🏻
KЛИКÅЙ И ПРOВĖPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪🟪
🔥 YBEPĖH ЧTÓ ФOT0K TB0EЙ ПODPŸГИ TYT HET ?
💔💍 ГЛA3 Б0ГA HAX0DИT ИHTИMHЫE Ф0TO ЛЮБ0Й DEBYШKИ B 0БЩEЙ БÅ3E
DÅЮ SSЫЛ0ЧKY 👇🏻👇🏻👇🏻
KЛИКÅЙ И ПРOВĖPЬ ✅🔎 HEЙРОСЕТЬ ПOИCKБот который ищет взлom на человека и проверяет наличие oткровенныx фото в общих базаx
-
впечатление, что DDL worker перестал процессить очередь, но это не точно
-
нельзя.
-
откуда 20.8 ?
проверяйте версию КХ на всех нодах -
Это версия cli/client
-
кстати, обнаружил на одном из узлов zk огромные простыни ошибок по дублирующимся метаданным
-
@den_crane @Alexey_037 добрый вечер, извините за поздний ответ, только сейчас повторился случае. Приблизительно каждый второй или третий день такое случается
https://pastila.nl/?02bdc0fe/4b8864d560ba1415538a57640e864762 -
>22.1.3.1
вам надо проапгредится до 22.3.12 -
Проблема в этом? В логах можно понять что создает проблему?
-
Cannot load data for command line suggestions: Code: 241. DB::Exception: Received from 10.10.10.10:9000. DB::Exception: Memory limit (total) exceeded: would use 49.47 TiB (attempt to allocate chunk of 4430006 bytes), maximum: 32.00 GiB. (MEMORY_LIMIT_EXCEEDED) (version 22.1.3.1)
посмотрите в логе какой запрос про suggestions упал. Но в любом случае 22.1.3.1 устарела безнадежно -
хорошо спасибо , просто интересно стало ответ запроса 'select * from system.merges'что нам дал? зачем он нужен был?) Я подумал причина проблему там скрывается.
-
нет, там нет ничего интересного.
надо смотреть /var/log/clickhouse... -
Привет! У меня не работает условие в WHERE - пытаюсь выбрать строки без пропуска, а всё равно получаю всё вместе с пропусками. Версия 22.5.2.53. Помогите, пожалуйста, найти причину
WITH tmp AS (
SELECT domain,
toNullable(interval_10m_start) AS interval_10m_start,
toNullable(interval_1d_start) AS interval_1d_start,
toNullable(interval_1w_start) AS interval_1w_start
FROM (SELECT domain,
toStartOfInterval(date_time, INTERVAL 10 MINUTE) AS interval_10m_start,
toStartOfDay(interval_10m_start) AS interval_1d_start,
toStartOfWeek(interval_10m_start) AS interval_1w_start
FROM (SELECT domain, date_time
FROM (SELECT arrayJoin(['domain-1', 'domain-2', 'domain-3']) AS domain) AS a
CROSS JOIN (SELECT arrayJoin(arrayMap(x -> toDateTime(x),
range(1666987800, 1666999800))) AS date_time) AS b)
GROUP BY domain, interval_10m_start)
GROUP BY GROUPING SETS ((domain, interval_10m_start),
(domain, interval_1d_start),
(domain, interval_1w_start)))
SELECT *
FROM tmp
WHERE interval_10m_start IS NOT NULL -- эта строчка не работает -
-
а если
SELECT *
FROM tmp
WHERE materialize(interval_10m_start) IS NOT NULL -
кстати это по уму надо делать функцией grouping
-
то же самое (
про grouping мне Клик отвечает Unknown function grouping -
а так ?
select * from (
SELECT *
FROM tmp limit 10000000000)
WHERE interval_10m_start IS NOT NULL -
получается o_O
притом пробовал так же, но без лимита
спасибо!
а почему так? -
ну баг это
у вас поля одинаково называются interval_10m_start) AS interval_10m_start
и предикейтпушдаун проталкивает IS NOT NULL куда-то очень глубоко
limit 10000000000 -- не позволяет сделать предикейтпушдаун, потому что нельзя переносить предикаты через лимит - 14 November 2022 (162 messages)
-
Почта Банк проводит акцию - оставь своё мнение и получи до 7OOO pyблей на свой счёт! Актуально только для клиентов Почта Банк, выплаты приходят на карту, деньги сразу можно потратить либо перевести.
Официальный сайт акции - http://pochtabank3000.ru/ -
Здравствуйте коллеги, у меня возникает ошибка при использовании _partition_value вместе с prewhere. Вот пример:
drop table if exists prewhere_test;
create table if not exists prewhere_test
(
`date` Date,
`value` Int64
)
ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date)
SETTINGS storage_policy = 'jbod_policy_1', index_granularity = 8192;
insert into prewhere_test (*) values ('2021-01-01', 1), ('2021-01-02', 2), ('2022-01-01', 3), ('2022-01-01', 4);
SELECT *
FROM prewhere_test
PREWHERE (_partition_value.1) = 202101
Query id: 2ea4c463-16f9-41a2-b405-ee9091bf7288
0 rows in set. Elapsed: 0.002 sec.
Received exception from server (version 22.6.1):
Code: 10. DB::Exception: Received from ххх. DB::Exception: Not found column _partition_value in block. (NOT_FOUND_COLUMN_IN_BLOCK)
Это ожидаемая ошибка или баг? -
А где у вас столбец _partition_value то? В описании таблицы только date и value....
-
_partition_value это виртуальный столбец, он создается тут: PARTITION BY toYYYYMM(date):
SELECT _partition_value
FROM prewhere_test
Query id: d6145770-ec93-4a64-b1d1-6a8aaaea8871
┌─_partition_value─┐
│ (202201) │
└──────────────────┘
┌─_partition_value─┐
│ (202101) │
│ (202101) │
└──────────────────┘
3 rows in set. Elapsed: 0.003 sec. -
Думаю баг, делайте issue. В доке не указаны ограничения для данных виртуальных столбцов
-
на самом деле виртуальные колонки не рассчитаны на использование в бизнес-логике.
они существуют для отладки при проблемах (отладке багов)
Нет никакго смысла их использовать. Partition pruning работает намного лучше если вы будете использовать where toYYYYMM(date) = 202101 (перформанс с виртуальными колонками наоборот хуже, очень многие оптимизации не работают) -
@den_crane, Спасибо за мопощь!
-
Коллеги, добрый день!
При работе с одни ПО использующим ClickHouse столкнулись с тем, что служба CH больше не стартует и выдает ошибку в логе
<Error> Application: Caught exception while loading metadata: Code: 44. DB::Exception: Sorting key cannot contain constants: Cannot attach table
Есть предположение, что во время работы была создана таблица с использованием недопустимого запроса и теперь при старте она не проходит проверку. Есть ли способ не стартуя сервер удалить метаданные об этой таблице? -
Коллеги, а есть у кого-нибудь пример вставки большого (50000+) количества строк в клик через офицальную библиотеку на джавке? В гугле много вариантов нашел, хочу отыскать самый надежный
-
Угу, в метадате sql файл таблицы удали/вытащи в другую директорию, потом, стартуешь клик, возвращаешь файл, делаешь аттач и дебажишь. Если дебажить не надо, то просто удали файл, потом почисти директорию с данными и путь в зк если реплицированная таблица
-
Это хорошо
-
Как можно MV держать в актуальном состоянии если в MV не предусмотрен datetime? Т.е. TTL нельзя повесить. Может можно как-то в метадату смотреть и чистить? :)
-
хех, а у меня все MV в таком же виде:
to table1_distributed
as select from table2_distributed
с проблемами пока не сталкивались.
Иметь смысл переделать на не распределённые таблицы? -
В том кейсе вероятно проблемы где-то еще (скорее в плохой версии). Но это просто первое что бросилось в глаза. Да имеет смысл переделать и не гонять вставляемые данные через Distributed. Это лишний оверхед и потенциальная точка отказа.
-
Ну так добавьте столбец last_updated DateTime materialized now()
Я везде так делаю, даже если есть еще 2-3 других DateTime. Как минимум помогает при поиске проблем. -
Как-то не натыкался на это в документации...
Спасибо -
Добрый день, используем clickhouse operator от altinity, с clickhouse версии 22.3.11.12, есть бани с хранением на S3 low cardinality string если они разряженные, кликхаус не может прочитать все данные. Думаю проапгрейдить версию кликхауса, какую последнюю стабильную версию порекомендуете ?
-
Спасибо!
Тогда попробую сейчас переписать MV на FROM *_replicated TO *_replicated
Спасибо за https://fiddle.clickhouse.com/ — не знал, удобно. Попробую туда перекинуть квери, но логику с шардами и т д все равно не воспроизвести. Особенно меня смущает, что на соседнем шарде поведение другое.
Попробую, отпишу что получилось, спасибо! -
Проверю, отпишу спасибо!
-
А как в этом случае вы бы сделали? Как тут "без затей"? Не хочется на стороне кучи сервисов решать в какой шард писать...
-
Да, это будем править, но я пока в процессе миграции на новый кластер и вот пытаюсь чтобы оно как-то работало. Переписать агрегации уже записал в беклог, упростим потом. Но хочу избавиться от этого вот произвольного задваивания данных сначала
-
Попробую поиграть с ними, спасибо!
-
Тестировал одну бд с тысячами полей таблиц и с непростыми условиями. Все выполнял на одном железе, одинаковые таблицы и т.д. В mysql выполнял запрос 4 сек, а в clickhouse 70ms, я очень удивлен за скорость, очень круто) Спасибо создателям и всем кто поддерживает работу clickhouse👍
-
<<непростыми условиями>>
вот это как раз не совсем про клику, хотя , конечно, все зависит от , что такое "непростые" -
офтопик:
вот опять это увидел и только у вас. почему вы используете женский род в отношении КХ? КХ, клик, кликхаус, просто бд в конце концов, но откуда эта "клика"???)))
*triggered* -
Привет! Вроде типичная задача. Есть таблица пользователей в Монге и в КХ. Данных о юзерах несколько гигабайт. Как решать проблему синка этих юзеров, что бы у аналитика всегда по userId было актуальное состояние пользователя. Можно с задержкой до часа.
Пока такие есть варианты:
1. дампить полностью данные из монги и перезаписывать таблицу с пользователями в КХ
2. вставлять строку на каждый апдейт пользователя со всеми его полями и с полем updated. А потом в запросе выбирать которые с максимальным updated -
ReplacingMergeTree и final в запросах.
-
-
CH умеет такое https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replacingmergetree/
Но у меня нет практического опыта, с удовольствием бы послушал внятный анализ, при каких условиях какой путь оптимален.ReplacingMergeTree | ClickHouse DocsThe engine differs from MergeTree in that it removes duplicate entries with the same sorting key value (ORDER BY table section, not PRIMARY KEY).
-
Здравствуйте, что означает FINAL в документации clickhouse в описании секции FROM для SELECT clause : [FROM [db.]table | (subquery) | table_function] [FINAL]
-
-
Спасибо
-
@fire_wheels @ilejn
а есть какие-то ресурсы или доклады на эту тему
вроде так и делаю, все равно мдленно получается
хочу подробней разобраться -
Запросы медленно?
-
как всегда всё зависит от условий.
- если у вас серваки рядом и подключены на 10Gbs и таблица пользователей не то чтобы сильно увеличивается, то можно каждый час перезаливать
- или можно сделать словарь который будет смотреть в монгу
- или debezium+kafka -
Оно и не должно быть быстро, это реально много работы.
Поэтому вполне допускаю, что перезалить все данные проще.
Ну и помимо FINAL в запросе можно сделать OPTIMIZE с DEDUPLICATE. Иногда так будет быстрее (например, если запросы типично достают много даных). -
do_not_merge_across_partitions_select_final попробуйте.
-
-
не знаю, подсознательно )
возможно потому что: клика - БД - база данных, а база это она -
Ребят, подскажите, почему может отвалиться DDL ON CLUSTER? Ранее работало исправно, теперь упорно не понимает имя БД из префикса таблицы (падают как ALTER, так и CREATE ... ON CLUSTER)
-
ближайший похожий кейс похож на наш:
https://github.com/ClickHouse/ClickHouse/issues/18755database xxx doesn't exist, but xxx is my table name not db name · Issue #18755 · ClickHouse/ClickHousethe log 2021.01.05 09:37:37.183262 [ 891 ] {} <Error> DynamicQueryHandler: Code: 81, e.displayText() = DB::Exception: Database xxx doesn't exist, Stack trace (when copying thi...
-
Переписал MV на FROM *_replicated TO *_replicated — поведение такое же. Ошибка на месте. Записал себе переписать все MVs но с решением этой описанной проблемы это не помогло к сожалению. Пробуем остальное, что посоветовали в чате.Kirill Markin in ClickHouse не тормозит
Доброе утро! У меня после определенного количества полей в materialized view select через sumMerge в агрегированной таблице начинает выдавать значение больше, чем sum по сырым данным. Это доходит до +100% (x2), но дальше не растет. Я могу прямо менять количество полей и получать разные значения в sumMerge. От полностью совпадающего с sum по сырым данным (меньше полей в MV или меньше записей при вставке) до x2 от сырых данных. Есть идеи, что я делаю не так и как избежать такого поведения? Даже отсутствие данных, если MV слишком долго отрабатывает было бы безопаснее в моем случае, чем увеличение значений до x2 от верных. Сижу с задачей уже дня 3, в личке помучал уже несколько человек, пока не получилось исправить или понять как это работает Все детали описал во вложенном .md файле с примерами запросов, настройками и так далее Подскажите на что еще посмотреть, пожалуйста
-
полный ассортимент способов дедубликации данных описан тут - https://kb.altinity.com/altinity-kb-schema-design/row-level-deduplication/
Самый очевидный как тут выше писали - это ReplacingMT/final/do_not_merge_across_partitions с правильно подобранным партиционированием. Это уже не так "много работы" как group by/argMax по всей таблице. Еще можно добавить переодический optimize final settings optimize_skip_merged_partitions=1 - возможно запросы станут чуть быстрее.
Но и остальные варианты тоже могут пригодиться.ClickHouse row-level deduplicationClickHouse row-level deduplication.
-
так вроде как самый ценный совет был от Денни - поменяйте версию, у вас совсем плохая
-
а вы как инсерты делаете?
у вас бекенд повторяет инсерты при ошибках?
есть вообще ошибки вставки? -
У нас на всех серверах оно не указано (default = false)
А как надо? И почему? (доки про это почитал, но хочется до конца понять) Кажется что false логичнее и то что нам надо, нет? -
покажите трейс ошибки
-
Ага, попробуем!
-
конечно true должно быть.
у вас Distributed таблица делает двойную вставку -
internal_replication=true значит что внизу Replicated и она сама internally будет делать репликацию
при internal_replication=false — репликацию делает Distributed (она пишет копию во все реплики) -
В КХ есть две репликации. Детская -- через distributed и настоящая -- через replicated. У вас сейчас обе сразу работают, детская <internal_replication>false , вам дублирует инсерты во все реплики, а потом настроящая снова дублирует, но вам везет что у вас не дублируются записи пока
короче если используете Replicated то internal_replication=true, без обсуждения. -
Сервисы пишут в кафку, консьюмеры берут из кафки вставляют в *_disctributed таблицы пачками по ~35000 записей
-
Интересно! А почему тогда у меня сырые данные не дублируются?
-
-
вам везед, дедупликация вставки работает
-
Блин! Прикольно
-
-
https://pastila.nl/?02615aeb/195be853fc06e46193ed0c2b93e7ad85 - загрузил вот сюда
-
покажите
select name,value from system.settings where name like 'remote_filesystem%'; -
SELECT
name,
value
FROM system.settings
WHERE name LIKE 'remote_filesystem%'
Query id: 6d646d6f-eefd-42ac-b0d2-eb1603c55124
┌─name────────────────────────────┬─value──────┐
│ remote_filesystem_read_method │ threadpool │
│ remote_filesystem_read_prefetch │ 1 │
└─────────────────────────────────┴────────────┘ -
Поменял, но не могу найти как проверить подтянулось ли и надо ли ребутать. Смотрю на данные. Если не поможет — пойду перезагружать машины.
-
Сработало! Спасибо большое! Все сходится теперь! Мы уже несколько дней с эти мучались! Спасибо!
-
перечитал исходники Clickhouse, нашёл только одно место (https://github.com/ClickHouse/ClickHouse/blob/c0d1be9caba894a86900adaeaea8ad96e110bd73/src/Interpreters/DatabaseCatalog.cpp), откуда может генериться этот эксепшн, но всё равно не понимаю логики:
1. DDL ON CLUSTER проходят
2. но лог сервера и CLI сыпят ошибками code 81ClickHouse/DatabaseCatalog.cpp at c0d1be9caba894a86900adaeaea8ad96e110bd73 · ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
перечитал ваше исходное сообщение ничего не понятно.
>понимает имя БД из префикса таблицы
что такое имя бд?
картинки не надо использовать, их никто не смотрит и все ненавидят
используйте https://pastila.nl , вставьте там текст и ссыку киньте в чат -
Спасибо!
- имя базы данных local
- сам запрос на раскидывание таблички по репликам работал ранее полтора года до рестарта одной из реплик (clickhouse2) https://pastila.nl/?10257daa/96819aff55d74418c5b25bb870a824fc
- CLI рождает такую ошибку https://pastila.nl/?237c1f67/96ec6265608e38b237063a6469d3f4e9
- стектрейс с второго узла CH (clickhouse2) https://pastila.nl/?0273f848/9618f297e0fa185c5de126799978b0e2
- если создавать таблицы на двух репликах отдельно в два запроса, то все DML реплицируются успешно -
объясните что это такое
DB::Exception:
Database local doesn't exist (version 20.8.3.18)
(version 21.2.4.6 (official build))
, server ClickHouseNode [uri=http://clickhouse1:8123/default,
чем вы запускаете запрос? почему :8123
и почему 21.2.4.6 и 20.8.3.18 ? -
покажите со второго сервера
select version()
show databases like '%local%' -
попробуйте помогает или нет (как тест, это ничего не сломает)
cat /etc/clickhouse-server/users.d/remote_filesystem.xml
<?xml version="1.0" ?>
<clickhouse>
<profiles>
<default>
<remote_filesystem_read_method>read</remote_filesystem_read_method>
<remote_filesystem_read_prefetch>0</remote_filesystem_read_prefetch>
</default>
</profiles>
</clickhouse> -
- запрос уходит из clickhouse.jdbc.ClickHouseDriver (мой локальный dbeaver -» HTTP API сервера clickhouse, 8123)
- тот же запрос, отправленный сlickhouse-client (20.8.3.18) https://pastila.nl/?140acfa1/182f431954030d05c061e2dcd626e43b
- завершается той же ошибкой 81 https://pastila.nl/?05ffe57a/94e8594bbebe615f7299a3e9a709e467
- версия сервера 21.2.4.6 (пока не можем обновиться)
- select version() https://pastila.nl/?62e3cc5e/1e8bf6bc09b94c1976e79a68554e067b
- show databases на сбоящем втором сервере: https://pastila.nl/?02f589a7/25c95a90f24c7242ac9dd4957b06f461
SIC! В анамнезе 4 дня назад случился рестарт узла clickhouse2, после чего отвалились ON CLUSTER DDL, до рестарта работало исправно 🤨 -
Добрый день. Возможно ли в clickhouse получить медиану массива?
-
SELECT
[1, 1, 1, 1, 5] AS a,
arrayReduce('median', a)
Query id: 29337a33-eab4-407a-b084-c3f4a06cb4be
┌─a───────────┬─arrayReduce('median', [1, 1, 1, 1, 5])─┐
│ [1,1,1,1,5] │ 1 │
└─────────────┴────────────────────────────────────────┘ -
какая-то полная хрень, ну 100% у вас один из серверов 20.8
select host_name, host_address, port from system.clusters where cluster = '....';
возможно два КХ запущено -
Спасибо. А то я уже думал через if писать 🙂
-
сам офигеваю.
- https://pastila.nl/?0b356cb7/47ac2d14fc5ea24c0b6367ea3003ed0c
- Сам клик из docker-образа, всего два контейнера на двух машинах - https://pastila.nl/?0b9857d4/83ba5cda99cd9d86b0dc7b304db98cb5
Подскажите (читал-читал и не нашёл), пожалуйста. В скобках эксепшнов (version 20.8.3.18) логгер не указывает клиент, только версию-билд сервера?
Меня это тоже смущает -
покажите
select FQDN(), materialize(uptime()), materialize(version()) from clusterAllReplicas('my_cluster', system.one) -
Спасибо!!!
Якого-то хрена в доставшейся мне на попечение инсталляции кроме контейнеризованных инстансов CH, на втором узле (clickhouse2) откуда ни возьмись 4 дня назад запустился бинарь сервера 20.8.3.18 на хосте, хотя его ни в стартап скриптах, ни в systemd юнитах нету, а сам сервер уже как 1.1 год не перезагружался -
/etc/cron.d/clickhouse
-
Уважаемые коллеги, а в Clickhouse есть оконные функции, ну как в Postresql, т. е. типа row_number() over() ?
-
Window Functions | ClickHouse Docs
ClickHouse supports the standard grammar for defining windows and window functions. The following features are currently supported:
-
Спасибо. Ушел грызть. 🥲
-
добрый день
пытаюсь собрать количество созданных транзакций и количество завершившихся в течении 5 минут после создания
беру для каждой записи делаю оконку с поиском минимальной даты в последующих строках
но нужно
1. оставить в выборке только дату и идентификатор создания
2. далее предполагается поверх посчитать уникальные идентификаторы и уложившиеся в 5 мину
Можно ли это сделать одним проходом с помощью Merge?
пример тут
https://fiddle.clickhouse.com/3849257e-0c2c-4984-96cd-173a5d0d26ec -
Подскажите, пожалуйста, есть ли какой-то более простой способ делать rewind для таблицы с ENGINE=kafka, чем:
1. detach
2. запуск kafka-consumer-groups
3. attach -
без Мерджей
https://fiddle.clickhouse.com/a26a088e-e01b-47e8-87ae-1fd4f21f6db4 -
Здравствуйте!
Подскажите пожалуйста, что не так с моим запросом
По идее все ок, в тестах ClickHouse есть примеры, но мой запрос не отрабатывает, установлена версия 21.8.9, посмотрел по комитам, вроде должно и там работать
UPDATE pf_system.notification SET check_interval = '0 0/5 * * * ? *', before_notify_check_count = 1, status = '{"createTime":0,"lastCheckTime":0,"description":"","state":"ENABLED","type":"SUCCESS"}' WHERE name = 'a'
Ошибка
Code: 62. DB::Exception: Syntax error: failed at position 1 ('UPDATE'): UPDATE pf_system.notification SET check_interval = '0 0/5 * * * ? *', before_notify_check_count = 1, status = '{createTime:0,lastCheckTime:0,description:,state:. Expected one of: Query, Query with output, EXPLAIN, SELECT query, possibly with UNION, list of union elements, SELECT query, subquery, possibly with UNION, SELECT subquery, SELECT query, WITH, SELECT, SHOW CREATE QUOTA query, SHOW CREATE, SHOW [TEMPORARY] TABLES|DATABASES|CLUSTERS|CLUSTER 'name' [[NOT] [I]LIKE 'str'] [LIMIT expr], SHOW, EXISTS or SHOW CREATE query, EXISTS, DESCRIBE CACHE query, DESCRIBE, DESC, DESCRIBE query, SHOW PROCESSLIST query, SHOW PROCESSLIST, CREATE TABLE or ATTACH TABLE query, CREATE, ATTACH, REPLACE, CREATE DATABASE query, CREATE VIEW query, CREATE DICTIONARY, CREATE LIVE VIEW query, CREATE WINDOW VIEW query, ALTER query, ALTER TABLE, ALTER LIVE VIEW, ALTER DATABASE, RENAME query, RENAME TABLE, EXCHANGE TABLES, RENAME DICTIONARY, EXCHANGE DICTIONARIES, RENAME DATABASE, DROP query, DROP, DETACH, TRUNCATE, CHECK TABLE, KILL QUERY query, KILL, OPTIMIZE query, OPTIMIZE TABLE, WATCH query, WATCH, SHOW ACCESS query, SHOW ACCESS, ShowAccessEntitiesQuery, SHOW GRANTS query, SHOW GRANTS, SHOW PRIVILEGES query, SHOW PRIVILEGES, INSERT query, INSERT INTO, USE query, USE, SET ROLE or SET DEFAULT ROLE query, SET ROLE DEFAULT, SET ROLE, SET DEFAULT ROLE, SET query, SET, SYSTEM query, SYSTEM, CREATE USER or ALTER USER query, ALTER USER, CREATE USER, CREATE ROLE or ALTER ROLE query, ALTER ROLE, CREATE ROLE, CREATE QUOTA or ALTER QUOTA query, ALTER QUOTA, CREATE QUOTA, CREATE ROW POLICY or ALTER ROW POLICY query, ALTER POLICY, ALTER ROW POLICY, CREATE POLICY, CREATE ROW POLICY, CREATE SETTINGS PROFILE or ALTER SETTINGS PROFILE query, ALTER SETTINGS PROFILE, ALTER PROFILE, CREATE SETTINGS PROFILE, CREATE PROFILE, CREATE FUNCTION query, DROP FUNCTION query, CREATE INDEX query, DROP INDEX query, DROP access entity query, GRANT or REVOKE query, REVOKE, GRANT, EXTERNAL DDL query, EXTERNAL DDL FROM, TCL query, BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION SNAPSHOT, Delete query, DELETE, BACKUP or RESTORE query, BACKUP, RESTORE. (SYNTAX_ERROR), Stack trace (when copying this message, always include the lines below): -
0. DB::Exception::Exception(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool) @ 0x78d627a in /usr/bic/1.0.0/clickhouse/bin/clickhouse
1. DB::parseQueryAndMovePosition(DB::IParser&, char const*&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, unsigned long, unsigned long) @ 0x13578e3f in /usr/bic/1.0.0/clickhouse/bin/clickhouse
2. DB::ClientBase::parseQuery(char const*&, char const*, bool) const @ 0x12dce75f in /usr/bic/1.0.0/clickhouse/bin/clickhouse
3. DB::ClientBase::analyzeMultiQueryText(char const*&, char const*&, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::shared_ptr<DB::IAST>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::unique_ptr<DB::Exception, std::__1::default_delete<DB::Exception> >&) @ 0x12ddcc07 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
4. DB::ClientBase::executeMultiQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x12ddd196 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
5. DB::ClientBase::processQueryText(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) @ 0x12dddf73 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
6. DB::ClientBase::runNonInteractive() @ 0x12de1463 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
7. DB::Client::main(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) @ 0x79d9fd0 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
8. Poco::Util::Application::run() @ 0x159c95c2 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
9. mainEntryClickHouseClient(int, char**) @ 0x79ed1e1 in /usr/bic/1.0.0/clickhouse/bin/clickhouse
10. main @ 0x78c422b in /usr/bic/1.0.0/clickhouse/bin/clickhouse
11. __libc_start_main @ 0x22555 in /usr/lib64/libc-2.17.so
12. _start @ 0x769db2e in /usr/bic/1.0.0/clickhouse/bin/clickhouse -
update в версии 21.8 не должен работать. Вы её с 22.8 не перепутали?
-
нету
-
В 22.9.3.18 тоже не отрабатывает
-
5 минут после текущей строки?
это делается с помощью range а не ROWS -
нету в КХ update.
есть alter table .... update
административная операция, очень тяжелая -
согласен, так правильнее
но как в условие пропихнуть 5 минут, а не как сейчас, искать минимум по рейнджу а потом сравнивать? -
можно ли в оконку
minIfOrNull(dt,status = 'delivered') over (PARTITION BY id ORDER by dt RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) as delivered_t,
пропихнуть то что сейчас снуружи
if(delivered_t < (dt + toIntervalMinute(5)),1,0) as ok_id -
-
гуд, с BETWEEN 1 FOLLOWING
но можно (и стоит ли) обойтись без запихивания этого в подзапрос, который сделает
toDate(dt),
uniqExact(id),
length(ids)
…
Group by toDate(dt)
? -
а и правда даже для EmbeddedRocksDB не сделали стандартного синтаксиса, хотя для delete - сделали.
Я что-то про EmbeddedRocksDB подумал, только сегодня обсуждали как его приладить для мелких словариков вместо отдельного внешнего mysql. -
-
Спасибо!
Оказалось я смотрел на примеры запросов через postgres в тестах ClickHouse -
-
-
rажется так красивее
minIfOrNull(dt,status = 'delivered') over (PARTITION BY id ORDER by dt ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) as delivered_t, -
полностью так
-
-
так я еще и статус проверяю, вдруг прилетит тот же id но создание и только первое беру
-
но хочется сделать без ложенности запросов
-
-
arraySort ?
-
-
-
ilike
-
Как и везде, изменитьрегистр на однозначный :))
-
match(lower(src),regexp)
-
не совсем как везде. в Sybase IQ в SQL в WHERE для полей VARCHAR можно не заморачиваться с регистром
-
это понятно
-
-
Ещё вариант написать свою функцию, для лаконичности
-
:))
-