184 похожих чатов

Ещё вопрос: >Too many parts (300). Merges are processing significantly slower

than inserts.
это означает, что у меня много партиций и мне нужно PARTITION BY (os, toYYYYMMDD(t)) поменять на PARTITION BY (os, toYYYYMM(t)) ?
или наоборот у меня много кусков в одной партиции и мне нужно PARTITION BY (os, toYYYYMMHH(t)) ?
после того как прочёл документацию, то склонялся к первому варианту, прочитав её же на английском уже склоняюсь ко второму варианту :)

посмотреть количество кусков в одной партиции можно вот так, верно?
SELECT table, partition, count()
FROM parts
WHERE active = 1
GROUP BY table, partition
ORDER BY count() DESC

у меня тут максимум 13 активных блоков на партицию получается, а не активных 116. хз откуда 300 взялось в ошибке.

20 ответов

18 просмотров

Это значит, что в одной партиции слишком много партов. Обычно это связано с тем, что добавление новых кусков происходит медленнее, чем слияние старых. Может помочь увеличение количества вставляемых за раз записей (рекомендуется до 1 млн) и увеличение числа потоков для фоновых мерджей (настройка background_pool_size).

у вас проблема с partition key, понизьте его кардинальность

Vladimir-Goncharov Автор вопроса
Tagir Gumerov
у вас проблема с partition key, понизьте его карди...

получается, что если понижу кардинальность partition key, то в одной партиции будет ещё больше блоков и будет только хуже

Vladimir Goncharov
получается, что если понижу кардинальность partiti...

При вставке батч бьётся на партсы, если мержить не успевает и накапливается 300+(по дефолту) партсов - вставка стопается.

Vladimir Goncharov
получается, что если понижу кардинальность partiti...

Выше уже написали, в вашем случае количество партиций будет меньше, но это не значит, что партов будет больше

Vladimir-Goncharov Автор вопроса
Alex
При вставке батч бьётся на партсы, если мержить не...

спасибо. можно как-то глянуть, сколько сейчас ещё не смёрженых партов? насколько я понял в system.parts where active=1 - это те, которые уже были смёржены

Vladimir Goncharov
спасибо. можно как-то глянуть, сколько сейчас ещё ...

select * from system.parts where table = <table> and active это активные парты

Tagir Gumerov
select * from system.parts where table = <table> ...

ну * оверхед, но да, каждая строка - 1 parts, если еще подробнее надо, есть еще parts_columns

Vladimir-Goncharov Автор вопроса
Alex
ну * оверхед, но да, каждая строка - 1 parts, если...

parts_columns я тоже смотрел, мне интересно глянуть сколько на текущий момент несмёрженых партов ожидают в очереди.

Tagir Gumerov
Выше уже написали, в вашем случае количество парти...

Но ведь это никак не поможет с решением проблемы. Ошибка же возникает именно при превышении лимита на число партов в одной партиции. А с уменьшением числа партиций вероятность увеличения числа партов в ней (в сферическом вакууме незнания вставляемых данных) только увеличивается.

Alexey Sokolov
Но ведь это никак не поможет с решением проблемы. ...

Не согласен, если у человека не* миллиард записей в секунду и ttl не на 1 день, то ключ партиционирования был избыточен Уменьшив кардинальность можно уменьшить количество созданных партов при 1 инсерте

Я кстати сделал бы order by (os, toDate(t),...) partition by toYYYYMM(t). Это судя по всему +-классика для большинства кэйсов.

Vladimir-Goncharov Автор вопроса
Tagir Gumerov
Я кстати сделал бы order by (os, toDate(t),...) pa...

видимо так и сделаю. ожидалось, что стату будут смотреть по платформам отдельно, но в итоге как обычно смотрят всё1 скопом, так что партицирование по os избыточно

Vladimir-Goncharov Автор вопроса
Alexey Sokolov
Это значит, что в одной партиции слишком много пар...

у меня вставка раз в минуту около 10к записей, поштучно вставляются только через буферную таблицу из неё только батчами раз в минуту. всего миллиард записей. нагрузка на диск и проц - околонулевая. никаких зукиперов и т.д. и тут на совершенно ровном месте такая хрень :) нету у меня миллиона записей за раз :)

Tagir Gumerov
Не согласен, если у человека не* миллиард записей ...

Насчёт увеличения числа партов на партицию был неправ, согласен, оно должно остаться неизменным. Не понимаю почему оно должно уменьшиться. Возможно, я чего-то не понимаю. Можете на примере проиллюстрировать? Вариант 1 - ключ партиционирования (A, B), оба ключа могут принимать только значения [0, 1], т.е. есть всего 4 партиции: 00, 01, 10 и 11. Вариант 2 - ключ партиционирования (A), ключ принимает значения [0, 1], т.е. всего две партиции: 0 и 1. Если вставка идёт раз в 5 секунд пачками по 1млн равномерно размазанных по партициям данных, то в первом случае имеем по 12 партов по 250к записей на каждую партицию в минуту, всего 48 партов, во втором случае имеем по 12 партов по 500к на каждую партицию в минуту, всего 24 парта. Но если данные размазаны по партициям неравномерно с перекосом, например, в (0, 0), то в первом случае будут те же 12 партов на партицию, только где-то они будут по, скажем, 700к, а где-то - по 100к. Во втором случае тоже по 12 партов на партицию, только по 800к и по 200к. Т.е. суммарное количество партов уменьшится, но число партов на партицию не изменится. Но ошибка-то возникает именно из-за большого количества партов на одну партицию.

Alexey Sokolov
Насчёт увеличения числа партов на партицию был неп...

Думаю, некорректный пример в том смысле, что кардинальность обоих полей всего 2. Была бы 10 и 100, то за несколько вставок можно было бы вставкой опередить мержи по количеству партов

Vladimir-Goncharov Автор вопроса
Alex
При вставке батч бьётся на партсы, если мержить не...

т.е. если у меня таблица с хреновым высококардинальным ключём (uuid) и происходит вставка 1000 строк, то эти строки разбиваются на парты, которые будут затрагиваться и после этого оказываются задеты чуть ли ни все парты таблицы, что создаёт немерено мёрджей, которые могут не успеть обработаться до следующей вставки и следующая вставка может привести к той проблеме, которую я словил?

Vladimir Goncharov
т.е. если у меня таблица с хреновым высококардинал...

Ну да, они же по итогу будут лежать в разных партициях. Instert - parts - merge - partition

Tagir Gumerov
Думаю, некорректный пример в том смысле, что карди...

Ну я правильно понимаю, что идея не в уменьшении числа новых партов на партицию, а в ускорении мерджей засчет уменьшения общего количества новых партов на все партиции?

Alexey Sokolov
Ну я правильно понимаю, что идея не в уменьшении ч...

Йеп, вы правильно поняли, может я не совсем точно выразился в первый раз

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта