
ααααΆααα½α, habr α
ααααα·αααΎααααΆααααΆααααααααααααα αααααααα αα·ααα½αααααααααα αΆααααΎαααΆααααα»α (IO, ααα αααΆαααααΎααααΆαα) αααααΆααααα±ααΆαααα ClickHouse ααααΌαααΆααααααΆααΆααααα½ααα½αααααΆαααααααα αα½αα ααα ααααΈαααααααΆαααααααααααααααααΆααΆαα’αα»ααααααΆααΈααΈααΈααααΌαααΆαααααΎααααΆαααα½α ααΆααααα ααΆααααααααΆαααα½ααααα·α α¬ .
ClickHouse αααααααΆααααα αΆαααααΆααα·αααααΆααΆααααΆαααα’α α§ααΆα ααα αααααΆααααΈααααααα·αααααα 2TiB ααΈααααΉα αα½αααΆααααΉα 300GiBα αααα»αααΉααα·αααααα ααΎααΆααααααααααααα’α·ααα ααΆαα’αααααααΆα αααΎαααΎαααααΆααααααα ααΎαααΈαααααα αα αΌαααααααααααααΈαααα αα·ααααα’αααΈαααΆααα’αααα»αααααααα’α₯αααα ααααΆαα½αααΉααααααααααα»α ClickHouse ααααααΎααααααα
αααα αΆααΆαα½αααααααααααΎααααΆαα
αα
glance ααααΌαα’αααΈααααααααΆααα½αααααααΎαααΆαααα’α αααα»αααΆα αααααΎαβααΆαβαααααβαααααΆααβααααααβααΆαβαααα»αβαααααα (ααααααβαααα retention) αααααΆαααααααααΎαααΆααΆααα½αααΆαααΆαααααΆααααα backend αααααΆαααααΎαααΎααααααΆαα graphite-webα + α¬ α’αΆαααααααΎααααα½αααΆαααααααΌαααααΎα α αΎα ... ααααΆααααααααααααΆααΆαααααα
ααΎααααΈαααααΈαα½αααΆ α’αααααααΌαααΉαααΈαααααααααΆααααα αΌαααααΎαααΆα αα·αααααΌαααΈαα·αααααααααααααα·αααααααα αααα»αααΆααΆααααΆαααΈααααααα½ααΆα *αααααΆα ClickHouse (ααΆααΆαααααΈ Alexey Zatelpin)α
- αααα
αΌα
Π±Π»ΠΎΠΊαα·ααααααα αααα»αααααΈααααααΎαααΆααΊααΆαααααΆαααααααΆααααααα

- αααα»αααααααααΈαα½ααααααΌαααΆαααααααααΆααααααΉααα»ααααααααΌαααΆαααααααα
ααΆαα
ORDER BYαααααΆαααα ααααααααΎαααΆααΆαα - αααααΆααααΈααΆααααααα,
ΠΊΡΡΠΎΠΊ(part) αα·ααααααααααΌαααΆαααααααα ααΈαα

- αααΆαααΈααααααα½ααα·αα·ααααααα»αααααααΆαααααα ααΌα
αααααα·αααΆααααααααααααα
αααΎααα α αΎαααΎαααααΎαααΆαααααααΆαααααα
ΡΠ»ΠΈΡΠ½ΠΈΡ(mergeαααααααααΆαααααα αΌαααααΆ)α


- αααΆαααΈααααααααααΎαααΆα αααα
αΌαα
αΌαααααΆααααααα½αα―α αααΆαααΆαα·αααααααααα αΌαα
αΌααααΆαααααα
ΠΏΠ°ΡΡΠΈΡΠΈΡ(partition) ααα»ααααα’αααα’αΆα α αΆααααααΎαααααΎαααΆαααααααααααααΎααΆααααααααΆOPTIMIZE. - ααααα·αβααΎβαα
βαααβααβαα½αβαα»αβαα
βαααα»αβααΆαααΆαβααα α’αααβααΉαβαα·αβα’αΆα
βααααΎαααΆαβααΆαβαααα
αΌαβααααΆβαααβααααΎβααΆαααβαααααΆβααααααΆβααβ
OPTIMIZE ... FINAL
ααΌα ααααααααααααΈαα½ααααααα α αΎααα½αααααααααααααααα ααααΉαααα·ααΆααααααααΆααα’αΆα αααααααα½αααααα’αΆαααααααΎαααααΆααΆα αααΎαα
- ααααΆααα α»α αααα ααα’αΆα ααΌα ααΆαα (αα½ααααα) α¬ααααΆαα (α αααΎααα)α
- ααΆαααααααα ααΆααααααααααΆααααααΆαα»αα’αΆα ααααΉαααααα·αααααΆααααααΌααααα»ααα·ααααααααααΆααααα½αα ααα½ααα αααα»αααΆαααΆαααααα (αααααααααααααΌαααΆααααααααΆ) α¬αααα ααααΆαα·ααααααα
- ααααα·αααΎααΆααα·ααααααα αααΎα αααααααΆααααααΌααααα»αααααααααΆαααααΆααααα αΌαααααΆααααααααΆααααααα’αΆα ααΆαααα ααααα½α αα α αΎα (ααααα·αααΎα’αααααααΎαααΎαααααΆααααα ααααααα·ααααααααααα»α) ααΉααα·ααααα αΌαααααΆααΆαα½αααααΆααααΌα αααααΈααααααα
α αΎαααΆααααααααα ααααΌα ααααΆα α ααααααααααΆααααΆααααααααααααα αααα»α ClickHouse ααΎαα‘αΎαααααααα·αααΎα
- αα»αα’αα»αααα
OPTIMIZE ... FINALαααααα¬ - αα»ααααα αΌααα·αααααααα αααα»αααΆαααΆαααΆααα’αααα ααΎααΌαααααΆαααααααα»αααααΎαααΆα ααΌα αααααα·αααΌααα·αααΆαα ααΆααααα αΌαααααααΆααααααααΉαα αΆααααααΎα
αα·ααΈααΆαααααααΈααΈαα αΆααααΌα
ααΆααΆααααα½ααααα»ααααα»αααΆαα’αα»αααα α αΎαααΌα
ααααααΆαα·αααααΉαααααΌααα α αΎαααααΌαααΆαααΆααααααα»αα
αααα»αααΆααααααααααααΈα python ααααΆαααααα½α αααααααΎαααααΆααα’ααα
ααααααααααΆααααΆαααααααααα»ααααααα 4 ααααΆαααααααα α αΎαααΆαααα cron αααααΆααααααα
αααααΆαααααα·ααααα·ααΆαααΆααααΌααααα ClickHouse DBMS ααΊααα’ααααΎααΆααα·ααααααΆαααααααααααααΉαααΆααα¬αααααααααααΎααΆαααΆαααααααΆααααααααΆααα’αα ααα»ααααααΆαα·αααΉαααΆαα
αααααΆααααα αααα»ααα·αα’αΆα
αααα
αΆαααααααααααααααααααα
αΆααα
αΆααααααΎααααα
αΌαααααΆααΆαα½α ααΌα
αααααΈα ααΆα
αααΆααααΆααααΆααΎαααααΌαααααααααα·ααΈααΎααααΈααααΎα±ααααΆααααααΎαααααα·αααααΆααααααααααααααααααααααααα·α

ααααααΆααα αααα»αααΆααΆααααααααα ClickHouse
αααααΎααα ααΆααααααααααΆααΆα . αααααΊααΆααααααΆαααααΌααααΌααΆαα’αααΈαααααααΈαα½ααααααΆααΆαααΆααα’αααα ααΎαααΆαααΈααα ClickHouse α αααα»αα αααααααααααααααα ααΆααα½αααααΆααααααα
- ααααα db (
database); - αααααααΆααΆα (
table); - ααααα αα·αααααααααΆααααΆαααΆα (
partition&partition_id); - αα
αααααααααααααααΌαααΆααααααΎαα‘αΎα (
modification_time); - ααΆαααα·α
ααααα’αααααααΆ αα·αα’αα·ααααΆαααα»ααα½ααα»α (ααΆααααα
ααααααΌαααΆαααααΎααααααα) (
min_date&max_date);
ααΆααα»αα½ααααααα ααΆαα½αααΉααα·ααααα½αα±ααα αΆααα’αΆααααααααΌα ααΆαααααα:
- ααααα db (
Tables.database); - αααααααΆααΆα (
Tables.table); - α’αΆαα»αααααα αα
ααααααααΆααααααΌααααα»ααααααΆαααα½αααααααΌαααΆαα’αα»αααα (
age);
ααΌα αααα:
- ααΎαβααΆαβααΆααΆαβααβααααΆααβαα½α αα·αβααΆααΆαβααβαααα½αβαα½αα
- ααΎααα½ααααα αΌαααααΆααΌαα ααα»α ααααααααααααα½ααα α αΎαααα½αααΆαααΆααΆαααΆααα’αα *GraphiteMergeTreeα
- ααΎααααα»ααααααααααΆαααΆαααΆααα’ααααααααα»ααααα
- α αααΎαααΆααα½ααα»α
- α¬αααααααΆααΆααααααααΎααααΈα’αα»ααααα
αααΆααααα»ααααααΆαα αα·α
modification_timeα αΆααααΆαααααααα
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
ααααΎαααα
SELECT
concat(p.database, '.', p.table) AS table,
p.partition_id AS partition_id,
p.partition AS partition,
-- Π‘Π°ΠΌΠΎΠ΅ "ΡΡΠ°ΡΠΎΠ΅" ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΎ Π΄Π»Ρ
-- ΠΏΠ°ΡΡΠΈΡΠΈΠΈ, Π½ΠΎ Π½Π΅ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ, ΡΠΌ (*)
max(g.age) AS age,
-- ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΡΡΠΊΠΎΠ² Π² ΠΏΠ°ΡΡΠΈΡΠΈΠΈ
countDistinct(p.name) AS parts,
-- ΠΠ° ΡΠ°ΠΌΡΡ ΡΡΠ°ΡΡΡΡ ΠΌΠ΅ΡΡΠΈΠΊΡ Π² ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ 00:00:00 ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π΄Π½Ρ
toDateTime(max(p.max_date + 1)) AS max_time,
-- ΠΠΎΠ³Π΄Π° ΠΏΠ°ΡΡΠΈΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°
max_time + age AS rollup_time,
-- ΠΠΎΠ³Π΄Π° ΡΠ°ΠΌΡΠΉ ΡΡΠ°ΡΡΠΉ ΠΊΡΡΠΎΠΊ Π² ΠΏΠ°ΡΡΠΈΡΠΈΠΈ Π±ΡΠ» ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ½
min(p.modification_time) AS modified_at
FROM system.parts AS p
INNER JOIN
(
-- ΠΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ Π²ΡΠ΅Ρ
ΡΠ°Π±Π»ΠΈΡ *GraphiteMergeTree
SELECT
Tables.database AS database,
Tables.table AS table,
age
FROM system.graphite_retentions
ARRAY JOIN Tables
GROUP BY
database,
table,
age
) AS g ON
(p.table = g.table)
AND (p.database = g.database)
WHERE
-- Π’ΠΎΠ»ΡΠΊΠΎ Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΊΡΡΠΊΠΈ
p.active
-- (*) Π ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊΠΈ, Π³Π΄Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π°Π³Π³ΡΠ΅Π³Π°ΡΠΈΠΈ ΡΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Ρ
AND ((toDateTime(p.max_date + 1) + g.age) < now())
GROUP BY
table,
partition
HAVING
-- Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ»Π°Π΄ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
(modified_at < rollup_time)
-- ΠΠ»ΠΈ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΡΡΠΊΠ°ΠΌΠΈ
OR (parts > 1)
ORDER BY
table ASC,
partition ASC,
age ASCαααα‘αααααααααΈαα½ααααααΆααΆα *GraphiteMergeTree αααααΆααα½ααααα
αΌαααααΆαα½ααααααααΎαααα αααΆαα ααΏααααα½αααααααααααΌαααααΎααΊααααΌαααααααΆαααα½αααααΆααα’ααααΆαα½αααΉαααΆαααααΎαα»α OPTIMIZE ... FINAL. ααΆαα’αα»ααααα
α»αααααααααααα
αααα»αααααΈααΆααα·ααααααΆαα·αα
αΆαααΆα
ααααααΆαααΆαααΆαα½αααΉαααΆαααααααααααααα
αααααΊααΆα’αααΈαααααααααααααΎ . α’ααΈααα αααα·αααααΈ Yandex.Market ααΆαααΆαααααααΆαα αααα»αααα·αααααααααααααααΆαααΆαα’αΆα ααΎαααΎαααΆααααααα

ααααα·αααΎα’αααααααΎαααΆααααααα·ααΈαα ααΎαααΆαααΈαααααΆαα½α ClickHouse ααΆααΉαα αΆααααααΎαααααΎαααΆαααΆααααααΆαα αααα»ααααααααα·αα ααααα½αααααααααΎααΉαααααΌαααΆαααααα·ααααα· ααααα·αα·αααααΎαααΆααΎααΆαααΆαααααΈαααα αΆααααΆαααΈααααααΆααααα αΆααααα½ααααα’αΆα ααααΌαααΆαααααΎα±αααααααΎαα
αααααΆαααααΆααααααααΎαααΊααααααααα αα deb αααΆαα αα ααΆαα α αΎαααααα·αααΎα’αΆα ααααΎαα ααΆαααααα rpm α
αααα½αα±ααααΆαααααα·ααααΆααα½α
αααα»ααααααα 9+ αααααααααααα αααα»αααΆααα αααα»ααααα»αα αα»ααααααααα»α ααΆαα αααΆααααααααΆααΆα αααΎαααΎααααΈαααααα α ααα»α ααααααααα ClickHouse αα·αααααΆα ααα·α ααα αααααα ααΆααΆαααα·αααααααααα’ αααααΆαα±ααααΆαααΆαααααΆααααααΌααααΆααα ααααΈααΆαααααΉαααααΆαα ClickHouse ααΆαααααααααα»αααααααα αααα»ααααααΉαααΆα’ααααααααααΊααΆααααααα½αααααΆαα αΆααααααΎααααααααΈαα½αα’αααΈα’αααΈαααααΆααααααα’αααααΎαααΆαααααΎα ααααααααααααααααααααααα αα·αα’αααΈαααααΉαααααΌαααααΎαα αααα’ααΆααα
ααααΆαααααΆα αααΎαααΈααα αα·ααααααααααααααααααΌαααΆαα αααΆαααΎααΆααααααΎαααααΎ αα½αααΆαα½αααΉα ααααααα»αα αααααα αΆαααΈααΆαααΉααα»ααααααααα»αα ααααααΆααα α αΎααααααααΆααααΆααα·αα·αααααΎαα’ααααααααα
ααααα: www.habr.com




