Clickhouse is best for collecting metrics, but metrics usualy come as short table example:
(example - you get metric from some device, than push it to clickhouse)

But columnar DB should save them as long table (for perfomance) for now - if you want to convert short table for long one - you need collector server + script, that transform metrics, when you have distributed arcitecture it is big problem, because some of metrics (from same device) can be handle on one server and another - on second server. Also that add time lag for adding metric (collector should wait all metric for device and after that - insert it).
I have an idea how to solve that problem.
Clickhouse should have Pivoting table (like pivot function in MSSQL/Oracle) but it should be not function - it should be table type. When we create that table type - we set some settings for that engine:

So, if we insert sample table (from my example) clickhouse:
As a result we get that table automaticaly:

And if clickhouse get new metric (new name in DYNAMIC column) - it ALTER table adding new column, than add new metric.
That function can gain huge performance for metrics usage case (when you have distributed collection network) and when you dont know what metrics you should collect tomorrow =)
_Russian translation of that:
ΠΡΠ΅Π½Ρ Π±Ρ Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ ΠΈΠΌΠ΅ΡΡ Π΄Π²ΠΈΠΆΠΎΠΊ ΡΠ°Π±Π»ΠΈΡ ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π° Π²Ρ
ΠΎΠ΄ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° - ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ (ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ) ΠΈ Π΄Π²Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅.
ΠΠ΅ΡΠ²Π°Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΠ²Π»ΡΡΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, Π° Π²ΡΠΎΡΠ°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° - Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ (Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°Ρ Π²ΡΡΠ΅).
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ - ΠΊΠΎΠ³Π΄Π° ΠΊ Π²Π°ΠΌ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ΡΠ·ΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°Π±Π»ΠΈΡ ΠΏΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΌΠ΅ΡΡΠΈΠΊ - ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠ»Π°ΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π² ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ·ΠΊΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅, Π° clickhouse ΡΠΆΠ΅ ΡΠ°ΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΡΠΆΠ½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ (ALTER TABLE) ΠΈ ΠΏΠΈΡΠ°ΡΡ Π² Π½ΠΈΡ Π½ΡΠΆΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΡΠΎΠΌ ΠΊΠ΅ΠΉΡΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΈΠ΄Π΅Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π·Π°Π»ΠΈΠ²Π°ΡΡΡΡ Π² clickhouse. ΠΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΡΠ΅Π³ΠΎΠ΄Π½Ρ Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΡΡΠΎ Π·Π°Π²ΡΡΠ° ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π½Π°Π΄ΠΎ ΡΠΈΠ»ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ . Π’ΠΊ Π΅ΡΠ»ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ Π² ΡΠ·ΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ - ΡΡΠΎ Π½Π΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ CH, Π΅ΡΠ»ΠΈ ΠΆΠ΅ Π΄Π΅Π»Π°ΡΡ ΡΠΈΡΠΎΠΊΡΡ ΡΠ°Π±Π»ΠΈΡΡ - ΡΠΎ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠΊΡΠΈΠΏΡ ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΡΠ»Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² CH + ΡΡΠΊΠ°ΠΌΠΈ Π΄Π΅Π»Π°ΡΡ ALTER.
Π Π΄Π°, ΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ replacing Π΄Π²ΠΈΠΆΠΎΠΊ ΠΈΠ»ΠΈ update ΡΠΊ ΡΡΡΠΎΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ Π½Π΅ ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ =)_
If you make your Dynamic.X a nested table, then you could do arrayElement(indexOf( to put specific key as a column manually.
hi, @alexey-milovidov @ztlpn, I also think dynamic column is useful for metric system.
Is there a plan to add the feature ?
Most helpful comment
hi, @alexey-milovidov @ztlpn, I also think
dynamic columnis useful for metric system.Is there a plan to add the feature ?