Real-time аналитикаХранилище данныхОбсервабилитиAI/MLCloudOss
Предварительные требования
- A running ClickHouse Cloud service. If you don’t have one yet, complete the Create your first Cloud service quickstart first.
Что вы создадите
ORDER BY и PARTITION BY, загрузите данные напрямую из S3, а затем выполните запрос к system.parts, чтобы увидеть, как ClickHouse физически организует данные на диске.
В итоге вы поймёте, почему движок MergeTree лежит в основе почти всех таблиц ClickHouse и как решения о сортировке и партиционировании напрямую влияют на производительность запросов.
Разберитесь, как работает MergeTree
Прежде чем писать SQL, полезно понять, чем MergeTree отличается от традиционной таблицы базы данных.Когда вы вставляете данные в таблицу MergeTree, ClickHouse не записывает строки по одной. Вместо этого он записывает часть данных — небольшой, отсортированный и сжатый фрагмент строк — напрямую на диск. Затем ClickHouse со временем в фоновом режиме сливает эти части. Отсюда и название: merge + tree.Каждая часть данных сортируется по выражениюORDER BY таблицы. Этот порядок сортировки становится индексом первичного ключа, что позволяет ClickHouse пропускать большие блоки данных, которые не нужно читать при выполнении запроса (это называется отсечением данных). Чем лучше столбцы в ORDER BY подходят для ваших самых частых запросов, тем меньше данных читает ClickHouse.То, как MergeTree организует данные, определяется тремя секциями:| Секция | Что она делает |
|---|---|
ORDER BY | Физически сортирует данные внутри каждой части. Определяет первичный ключ. Обязательно. |
PARTITION BY | Разделяет данные на отдельные партиции, обычно по диапазону дат. Части из разных партиций никогда не сливаются, что позволяет быстро отсекать партиции. |
PRIMARY KEY | По умолчанию совпадает с ORDER BY, если вы явно не зададите более короткий префикс. На его основе строится разреженный индекс. |
Предпросмотр исходных данных
Перед созданием таблицы просмотрите исходный файл с помощью табличной функцииs3. Это позволяет выполнять запросы к S3 напрямую, не записывая данные в ClickHouse.Выполните следующее в SQL-консоли:Nullable(String). ClickHouse читает необработанный CSV, поэтому не знает реальные типы данных — это вы исправите на следующем шаге, когда будете проектировать схему таблицы.Просмотрите несколько строк:id транзакции, price продажи, date, type недвижимости, поля адреса и географические идентификаторы. Вы также заметите два последних столбца (column15, column16), которые пусты, — их можно игнорировать.Убедитесь в этом: должны отображаться строки со столбцами id, price, date, postcode, type, town и county.Спроектируйте и создайте таблицу MergeTree
Теперь создайте постоянную таблицу с подходящей схемой. Перечисленные ниже типы столбцов выбраны не случайно:LowCardinality(String)используется для столбцов с небольшим числом уникальных значений (почтовые индексы, названия городов, названия графств). Этот тип внутренне использует кодирование с использованием словаря, что значительно уменьшает объём хранимых данных и повышает производительность группировки и фильтрации по этим столбцам.Enum8кодирует столбцыtypeиdurationкак небольшие целые числа на диске, сохраняя при этом понятные человеку строковые обозначения в запросах. В исходном CSV используются однобуквенные коды, поэтому мы сопоставим их при вставке.PARTITION BY toYYYYMM(date)создаёт по одной партиции на каждый календарный месяц, что позволяет ClickHouse пропускать целые месяцы, когда условиеWHEREфильтрует поdate.ORDER BY (postcode, addr1, addr2)сортирует данные так, чтобы обеспечить быстрый поиск по адресу объекта недвижимости — это наиболее естественный способ доступа к этому набору данных.
ENGINE = MergeTree, ClickHouse Cloud создал таблицу с SharedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}'). Это ожидаемо: Cloud автоматически преобразует MergeTree в SharedMergeTree, добавляя репликацию и поддержку общего хранилища. Поведение и интерфейс запросов остаются прежними.Загрузите данные из S3
Выполните вставку всего набора данных напрямую из табличной функцииs3(). ClickHouse потоково читает сжатый файл из S3 и записывает его в вашу таблицу в виде отсортированных частей.T для terraced, F для freehold, Y/N для new-build), мы используем transform, чтобы преобразовать их в понятные значения, а toUInt32/if — чтобы привести числовые столбцы к нужному типу. Столбцы id, column15 и column16 исключены, так как они нам не нужны.Это займет одну-две минуты в зависимости от размера вашего сервиса. После завершения проверьте количество строк:Изучите части с помощью system.parts
Здесь можно увидеть внутренние компоненты MergeTree. Таблицаsystem.parts отслеживает все части данных на диске во всех таблицах MergeTree вашего сервиса.partition— значениеYYYYMM, полученное из выраженияPARTITION BY. Данные за каждый месяц хранятся отдельно.name— в имени части закодированы партиция, диапазон номеров блоков и уровень слияния (например,199501_1_4_2означает партицию199501, блоки 1–4 и два слияния).marks— количество гранул индекса. По умолчанию каждая гранула охватывает 8 192 строки, а индекс первичного ключа хранит одну запись на гранулу. Именно этот разреженный индекс остается в памяти и позволяет быстро пропускать ненужные данные.bytes_on_disk— ClickHouse по умолчанию сжимает каждую часть по столбцам с помощью LZ4. Сравните это значение с исходным размером, чтобы оценить коэффициент сжатия.
active = true гарантирует, что вы видите только текущие, слитые части, а не более старые части, ожидающие очистки.Выполните запрос к данным и посмотрите, как ведёт себя первичный ключ
Теперь выполните несколько реальных аналитических запросов. Сначала найдите самые дорогие продажи за всё время:price не входит в ключ ORDER BY, ClickHouse не может использовать первичный индекс для пропуска данных и вынужден выполнять полное сканирование таблицы.Затем найдите среднюю цену продажи по округам:county не входит в ORDER BY или PARTITION BY, поэтому ClickHouse сканирует всю таблицу.Теперь выполните запрос, который сочетает агрегацию с ORDER BY. Поскольку данные отсортированы по (postcode, addr1, addr2), фильтрация по префиксу почтового индекса позволяет ClickHouse пропустить бо́льшую часть таблицы. Здесь мы находим среднюю цену продажи по годам для объектов недвижимости в зоне почтового индекса SW1A:postcode должна читать лишь небольшую долю строк таблицы, показывая, как работает индекс первичного ключа. Сравните это с предыдущими запросами, которые сканируют таблицу гораздо шире, — разница показывает, почему так важно правильно выбрать ORDER BY.