Модель выполнения DataStore
Понимание модели ленивых вычислений DataStore — ключ к его эффективному использованию и достижению оптимальной производительности.
Отложенное вычисление
DataStore использует отложенное вычисление — операции не выполняются сразу, а записываются и компилируются в оптимизированные SQL-запросы. Выполнение происходит только тогда, когда результаты действительно нужны.
Пример: ленивые и жадные вычисления
Преимущества ленивых вычислений
- Оптимизация запросов: Несколько операций компилируются в один оптимизированный SQL‑запрос
- Проталкивание фильтров: Фильтры применяются на уровне источника данных
- Отсечение столбцов: Считываются только необходимые столбцы
- Отложенный выбор: Движок выполнения можно выбрать во время выполнения
- Анализ плана: Вы можете просмотреть и отладить запрос перед выполнением
Триггеры выполнения
Выполнение автоматически запускается, когда требуются фактические значения:
Автоматические триггеры
| Триггер | Пример | Описание |
|---|---|---|
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 |
Примеры:
Операции, которые выполняются лениво
| Operation | Returns | Description |
|---|---|---|
filter() | DataStore | Добавляет предложение WHERE |
select() | DataStore | Добавляет выбор столбцов |
sort() | DataStore | Добавляет ORDER BY |
groupby() | LazyGroupBy | Подготавливает GROUP BY |
join() | DataStore | Добавляет JOIN |
ds['col'] | ColumnExpr | Ссылка на столбец |
ds[['col1', 'col2']] | DataStore | Выбор столбцов |
Примеры:
Трёхфазное выполнение
Операции DataStore используют трёхфазную модель выполнения:
Этап 1: построение SQL-запроса (отложенное)
Операции, которые можно выразить в SQL, накапливаются:
Фаза 2: Точка выполнения
Когда срабатывает триггер, накопленный SQL-запрос выполняется:
Фаза 3: операции с DataFrame (если есть)
Если после выполнения вы добавляете цепочку операций, выполняемых исключительно средствами pandas:
Просмотр планов выполнения
Используйте explain(), чтобы увидеть, что именно будет выполнено:
Вывод:
Используйте verbose=True, чтобы получить более подробные сведения:
Полную документацию см. в разделе Отладка: explain().
Кеширование
DataStore кеширует результаты выполнения, чтобы избежать повторных запросов.
Как устроено кэширование
Инвалидация кэша
Кэш становится недействительным, когда операции модифицируют DataStore:
Ручное управление кэшем
Смешивание операций SQL и Pandas
DataStore интеллектуально обрабатывает операции, сочетающие SQL и Pandas:
Операции, совместимые с SQL
Эти операции транслируются в SQL:
filter(),where()select()groupby(),agg()sort(),orderby()limit(),offset()join(),union()distinct()- Операции над столбцами (арифметика, сравнение, строковые методы)
Операции только в pandas
Эти операции запускают выполнение и используют pandas:
apply()с пользовательскими функциямиpivot_table()со сложными агрегациямиstack(),unstack()- Операции с выполненными объектами DataFrame
Гибридные конвейеры
Выбор движка выполнения
DataStore может выполнять операции с использованием различных движков:
Автоматический режим (по умолчанию)
Принудительный выбор движка chDB
Принудительное использование движка Pandas
Подробности см. в разделе Configuration: Execution Engine.
Влияние на производительность
Хорошо: ранняя фильтрация
Плохо: фильтровать поздно
Хорошо: выбирайте столбцы как можно раньше
Лучше так: пусть за вас работает SQL
Краткое изложение передовых практик
- Связывайте операции перед выполнением - Сформируйте полный запрос, затем выполните его один раз
- Фильтруйте как можно раньше - Уменьшайте объем данных на стороне источника
- Выбирайте только нужные столбцы - Исключение лишних столбцов улучшает производительность
- Используйте
explain()для понимания выполнения - Отлаживайте перед запуском - Позвольте SQL обрабатывать агрегации - ClickHouse оптимизирован для этого
- Понимайте, что именно запускает выполнение - Избегайте случайного раннего выполнения
- Разумно используйте кэширование - Понимайте, когда кэш инвалидируется