Отложенное вычисление
Пример: отложенное и немедленное вычисление
Преимущества отложенного вычисления
- Оптимизация запроса: Несколько операций объединяются в один оптимизированный SQL-запрос
- Pushdown фильтров: Фильтры применяются на уровне источника данных
- Исключение лишних столбцов: Считываются только нужные столбцы
- Отложенный выбор: Движок выполнения можно выбрать во время выполнения
- Просмотр плана: Перед выполнением можно просмотреть и отладить запрос
Триггеры выполнения
Автоматические триггеры
| Trigger | Пример | Описание |
|---|---|---|
print() / repr() | print(ds) | Показать результаты |
len() | len(ds) | Получить число строк |
.columns | ds.columns | Получить имена столбцов |
.dtypes | ds.dtypes | Получить типы столбцов |
.shape | ds.shape | Получить размерность |
.index | ds.index | Получить индекс строк |
.values | ds.values | Получить массив NumPy |
| Iteration | for row in ds | Перебирать строки |
to_df() | ds.to_df() | Преобразовать в pandas |
to_pandas() | ds.to_pandas() | Псевдоним для to_df |
to_dict() | ds.to_dict() | Преобразовать в dict |
to_numpy() | ds.to_numpy() | Преобразовать в массив |
.equals() | ds.equals(other) | Сравнить DataStore |
Операции, которые остаются ленивыми
| Операция | Возвращает | Описание |
|---|---|---|
filter() | DataStore | Добавляет предложение WHERE |
select() | DataStore | Добавляет выборку столбцов |
sort() | DataStore | Добавляет ORDER BY |
groupby() | LazyGroupBy | Подготавливает GROUP BY |
join() | DataStore | Добавляет JOIN |
ds['col'] | ColumnExpr | Ссылка на столбец |
ds[['col1', 'col2']] | DataStore | Выборка столбцов |
Трёхфазная модель выполнения
Фаза 1: Построение SQL-запроса (отложенное)
Фаза 2: Момент выполнения
Этап 3: Операции с DataFrame (если есть)
Просмотр планов выполнения
explain(), чтобы посмотреть, что именно будет выполнено:
Query
Response
verbose=True, чтобы получить более подробную информацию:
Кэширование
Как работает кэширование
Сброс кэша
Ручное управление кэшем
Сочетание операций SQL и Pandas
Операции с поддержкой SQL
filter(),where()select()groupby(),agg()sort(),orderby()limit(),offset()join(),union()distinct()- Операции со столбцами (математика, сравнение, строковые методы)
Операции только в Pandas
apply()с пользовательскими функциямиpivot_table()со сложными агрегациямиstack(),unstack()- Операции с уже выполненными DataFrame
Гибридные конвейеры
Выбор движка выполнения
Автоматический режим (по умолчанию)
Принудительно использовать движок chDB
Принудительное использование движка pandas
Влияние на производительность
Хорошо: фильтровать как можно раньше
Плохо: фильтровать слишком поздно
Хорошо: сразу выбирайте нужные столбцы
Хорошая практика: пусть SQL делает всю работу
Краткий обзор рекомендаций
- Объединяйте операции в цепочку перед выполнением - Сначала соберите полный запрос, затем запускайте его один раз
- Фильтруйте как можно раньше - Сокращайте объём данных в источнике
- Выбирайте только нужные столбцы - Отсечение столбцов повышает производительность
- Используйте
explain(), чтобы понять выполнение - Отлаживайте до запуска - Поручайте агрегации SQL - ClickHouse оптимизирован для этого
- Учитывайте, что запускает выполнение - Избегайте случайного преждевременного запуска
- Используйте кэширование с умом - Понимайте, когда кэш сбрасывается