ΠΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡ, habr.
ΠΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠΈΡΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΡ
ClickHouse Ρ ΠΎΡΠΎΡΠΎ ΡΠ΅ΡΠ°Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π»ΠΈΠ²ΠΊΠΈ 2TiB Π΄Π°Π½Π½ΡΡ ΠΈΠ· whisper, ΠΎΠ½ΠΈ ΡΠΌΠ΅ΡΡΠΈΠ»ΠΈΡΡ Π² 300GiB. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Ρ, ΡΡΠ°ΡΠ΅ΠΉ Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ Ρ Π²Π°ΡΠ°Π΅Ρ. Π ΡΠΎΠΌΡ ΠΆΠ΅, Π΄ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ Π½Π°ΡΠΈΠΌ ClickHouse Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ Π±ΡΠ»ΠΎ Π½Π΅ Π²ΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅ΠΌΡΠΌ ΠΌΠ΅ΡΡΠΎΠΌ
ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π²ΡΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ
ΠΎΡΠΎΡΠΎ. Π‘Π»Π΅Π΄ΡΡ retention
), Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ Π±Π΅ΠΊΠ΅Π½Π΄Π° Π΄Π»Ρ graphite-web:
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠ°Ρ, Π½Π°Π΄ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠΉ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΠΏΡΡΡ Π΄Π°Π½Π½ΡΡ
Π² ΡΠ°Π±Π»ΠΈΡΠ°Ρ
Π΄Π²ΠΈΠΆΠΊΠΎΠ² ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° *MergeTree ClickHouse (Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ Π²Π·ΡΡΡ ΠΈΠ·
- ΠΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ
Π±Π»ΠΎΠΊ
Π΄Π°Π½Π½ΡΡ . Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΏΡΠΈΠ»Π΅ΡΠ΅Π»ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
- ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΠΈΡΡΡ Π½Π° Π΄ΠΈΡΠΊ ΡΠΎΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠ»ΡΡΡ
ORDER BY
, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ. - ΠΠΎΡΠ»Π΅ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ,
ΠΊΡΡΠΎΠΊ
(part
) Π΄Π°Π½Π½ΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π° Π΄ΠΈΡΠΊ.
- Π‘Π΅ΡΠ²Π΅Ρ ΡΠ»Π΅Π΄ΠΈΡ Π² ΡΠΎΠ½Π΅, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΈΡ
ΠΊΡΡΠΊΠΎΠ² Π±ΡΠ»ΠΎ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠΎΠ½ΠΎΠ²ΡΠ΅
ΡΠ»ΠΈΡΠ½ΠΈΡ
(merge
, Π΄Π°Π»Π΅Π΅ ΠΌΠ΅ΡΠΆΠΈ).
- Π‘Π΅ΡΠ²Π΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΌΠ΅ΡΠΆΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ Π²
ΠΏΠ°ΡΡΠΈΡΠΈΡ
(partition
), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΡΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉOPTIMIZE
. - ΠΡΠ»ΠΈ Π² ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΠΎΡΡΠ°Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΡΡΠΎΠΊ, ΡΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΌΠ΅ΡΠΆ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
OPTIMIZE ... FINAL
ΠΡΠ°ΠΊ, ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ. Π ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π΅ΠΊΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. ΠΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ ΠΌΠΎΠ³ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ°ΠΊΡΠΎΡΠΎΠ²:
- ΠΠ»ΡΡ ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌ (Π΄Π΅Π½Ρ), ΡΠ°ΠΊ ΠΈ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ (Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΡΠ΅Π²).
- ΠΠΎΠ½ΡΠΈΠ³ retention ΠΌΠΎΠΆΠ΅Ρ ΡΠΌΠ΅ΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠ³ΠΎΠ² Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ Π²Π½ΡΡΡΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ (ΠΊΡΠ΄Π° ΠΈΠ΄ΡΡ Π·Π°ΠΏΠΈΡΡ ΠΌΠ΅ΡΡΠΈΠΊ), Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π΅Ρ.
- ΠΡΠ»ΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠΎ ΡΠ°ΠΌΡΠ΅ ΡΠ°Π½Π½ΠΈΠ΅ ΠΊΡΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ·-Π·Π° ΡΠΎΠ½ΠΎΠ²ΡΡ ΠΌΠ΅ΡΠΆΠ΅ΠΉ ΠΌΠΎΠ³ΡΡ ΡΠΆΠ΅ Π±ΡΡΡ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΌΠΈ (ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ Π½Π΅ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ), Π½Π΅ Π±ΡΠ΄ΡΡ ΠΌΠ΅ΡΠΆΠΈΡΡΡΡ ΡΠ°ΠΌΠΈ ΡΠΎ ΡΠ²Π΅ΠΆΠΈΠΌΠΈ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌΠΈ ΠΊΡΡΠΊΠ°ΠΌΠΈ.
Π Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π° Π²ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. ΠΠ΅ΡΡΠΎ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ Π² ClickHouse ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡΡ, Π΅ΡΠ»ΠΈ:
- Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ
OPTIMIZE ... FINAL
Π²ΡΡΡΠ½ΡΡ ΠΈΠ»ΠΈ - Π½Π΅ Π²ΡΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΎ Π²ΡΠ΅ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ Π½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Π΅, ΡΡΠΎΠ±Ρ ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΠΌΠ΅ΡΠΆ
ΠΡΠΎΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠΌ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ, Π·Π½Π°ΡΠΈΡ, ΠΎΠ½ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΈ Π±ΡΠ» ΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π½ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
Π― Π½Π°ΠΏΠΈΡΠ°Π» Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ Π½Π° python, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ» ΡΠΈΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π½Ρ Π·Π° ΠΏΡΠΎΡΠ»ΡΠ΅ 4 Π³ΠΎΠ΄Π° ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π»ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Ρ ΠΊΡΠΎΠ½ΠΎΠΌ.
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²ΡΡ ΡΠ°Π±ΠΎΡΠ° ClickHouse DBMS ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° Π½Π° ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΡΠ΄Π΅Π»Π°Π΅Ρ Π²ΡΡ ΡΠΎΠ½ΠΎΠ²ΡΡ ΡΠ°Π±ΠΎΡΡ, Π½ΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΊΠΎΠ³Π΄Π°, ΡΠΎ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°ΡΡΠ΅ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠ΅ ΠΊΡΡΠΊΠΈ ΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΡ Π½Π°ΡΠ°ΡΡ ΠΌΠ΅ΡΠΆ Ρ Π½ΠΎΠ²ΡΠΌΠΈ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌΠΈ, ΠΌΠ½Π΅ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ. Π‘ΡΠ°Π»ΠΎ ΡΡΠ½ΠΎ, ΡΡΠΎ Π½Π°Π΄ΠΎ ΠΈΡΠΊΠ°ΡΡ ΡΠΏΠΎΡΠΎΠ± Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΠ°Ρ ClickHouse
ΠΠ·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΡΡΡΠΊΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ
- ΠΈΠΌΡ ΠΠ (
database
); - ΠΈΠΌΡ ΡΠ°Π±Π»ΠΈΡΡ (
table
); - ΠΈΠΌΡ ΠΈ ΠΠ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ (
partition
&partition_id
); - ΠΊΠΎΠ³Π΄Π° ΠΊΡΡΠΎΠΊ Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ (
modification_time
); - ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π΄Π°ΡΠ° Π² ΠΊΡΡΠΊΠ΅ (ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄ΡΡ ΠΏΠΎ Π΄Π½ΡΠΌ) (
min_date
&max_date
);
Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°
- ΠΈΠΌΡ ΠΠ (
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
. Π ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΡΠ½ ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΡΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡΡ ΡΡΠΎΠ³Π°ΡΡ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
ΠΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ ΠΈ Π΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΠ΅ΠΊΡ
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Ρ ClickHouse, ΡΠΎ ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ Π½Π°ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½Π°. Π Π°Π· Π² ΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π·Π°ΠΏΡΠΎΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡ, Π½Π΅ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π»ΠΈ Π½ΠΎΠ²ΡΠ΅ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΡΡΠ°ΡΡΠ΅ ΡΡΡΡ ΡΡΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
Π Π±Π»ΠΈΠΆΠ°ΠΉΡΠΈΡ ΠΏΠ»Π°Π½Π°Ρ β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, deb ΠΏΠ°ΠΊΠ΅ΡΡ, Π° ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ β Π΅ΡΡ ΠΈ rpm.
ΠΠΌΠ΅ΡΡΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ΠΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΠ΅ 9 Ρ Π»ΠΈΡΠ½ΠΈΠΌ ΠΌΠ΅ΡΡΡΠ΅Π² Ρ Π²Π½ΡΡΡΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ
ΠΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π·Π°ΠΏΡΠΎΡΠ° Π±ΡΠ»ΠΎ ΠΏΠΎΡΡΠ°ΡΠ΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»ΠΈΡΡΠΎΠ² ΠΏΠΈΠ²Π° ΠΈ Π°Π΄ΠΌΠΈΠ½ΠΎ-Π΄Π½Π΅ΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com