Перейти к основному содержимому
Перейти к основному содержимому

Отладка DataStore

DataStore предоставляет комплексные инструменты отладки для анализа и оптимизации ваших конвейеров данных.

Обзор инструментов отладки

ИнструментНазначениеКогда использовать
explain()Просмотр плана выполненияПонять, какой SQL‑запрос будет выполнен
ProfilerИзмерение производительностиНайти медленные операции
LoggingПросмотр деталей выполненияОтладка неожиданного поведения

Быстрая матрица решений

ЗадачаИнструментКоманда
Посмотреть план выполненияexplain()ds.explain()
Измерить производительностьProfilerconfig.enable_profiling()
Отладить SQL‑запросыLoggingconfig.enable_debug()
Всё вышеперечисленноеКомбинированный подходСм. ниже

Быстрый запуск

Включить полную отладку

from chdb import datastore as pd
from chdb.datastore.config import config

# Enable all debugging
config.enable_debug()        # Verbose logging
config.enable_profiling()    # Performance tracking

ds = pd.read_csv("data.csv")
result = ds.filter(ds['age'] > 25).groupby('city').agg({'salary': 'mean'})

# View execution plan
result.explain()

# Get profiler report
from chdb.datastore.config import get_profiler
profiler = get_profiler()
profiler.report()

Метод explain()

Просмотрите план выполнения перед запуском запроса.

ds = pd.read_csv("data.csv")

query = (ds
    .filter(ds['amount'] > 1000)
    .groupby('region')
    .agg({'amount': ['sum', 'mean']})
)

# View plan
query.explain()

Вывод:

Pipeline:
  Source: file('data.csv', 'CSVWithNames')
  Filter: amount > 1000
  GroupBy: region
  Aggregate: sum(amount), avg(amount)

Generated SQL:
SELECT region, SUM(amount) AS sum, AVG(amount) AS mean
FROM file('data.csv', 'CSVWithNames')
WHERE amount > 1000
GROUP BY region

Подробности см. в документации по explain().


Профилирование

Измеряйте время выполнения каждой операции.

from chdb.datastore.config import config, get_profiler

# Enable profiling
config.enable_profiling()

# Run operations
ds = pd.read_csv("large_data.csv")
result = (ds
    .filter(ds['amount'] > 100)
    .groupby('category')
    .agg({'amount': 'sum'})
    .sort('sum', ascending=False)
    .head(10)
    .to_df()
)

# View report
profiler = get_profiler()
profiler.report(min_duration_ms=0.1)

Вывод:

Performance Report
==================
Step                          Duration    Calls
----                          --------    -----
read_csv                      1.234s      1
filter                        0.002s      1
groupby                       0.001s      1
agg                           0.089s      1
sort                          0.045s      1
head                          0.001s      1
to_df (SQL execution)         0.567s      1
----                          --------    -----
Total                         1.939s      7

См. руководство по профилированию для получения подробной информации.


Логирование

Просматривайте подробные логи выполнения.

from chdb.datastore.config import config

# Enable debug logging
config.enable_debug()

# Run operations - logs will show:
# - SQL queries generated
# - Execution engine used
# - Cache hits/misses
# - Timing information

Пример вывода логов:

DEBUG - DataStore: Creating from file 'data.csv'
DEBUG - Query: SELECT region, SUM(amount) FROM ... WHERE amount > 1000 GROUP BY region
DEBUG - Engine: Using chdb for aggregation
DEBUG - Execution time: 0.089s
DEBUG - Cache: Storing result (key: abc123)

Подробности см. в разделе Logging Configuration.


Типичные сценарии отладки

1. Запрос не возвращает ожидаемые результаты

# Step 1: View the execution plan
query = ds.filter(ds['age'] > 25).groupby('city').sum()
query.explain(verbose=True)

# Step 2: Enable logging to see SQL
config.enable_debug()

# Step 3: Run and check logs
result = query.to_df()

2. Медленное выполнение запроса

# Step 1: Enable profiling
config.enable_profiling()

# Step 2: Run your query
result = process_data()

# Step 3: Check profiler report
profiler = get_profiler()
profiler.report()

# Step 4: Identify slow operations and optimize

3. Принципы выбора движка

# Enable verbose logging
config.enable_debug()

# Run operations
result = ds.filter(ds['x'] > 10).apply(custom_func)

# Logs will show which engine was used for each operation:
# DEBUG - filter: Using chdb engine
# DEBUG - apply: Using pandas engine (custom function)

4. Отладка проблем с кэшем

# Enable debug to see cache operations
config.enable_debug()

# First run
result1 = ds.filter(ds['x'] > 10).to_df()
# LOG: Cache miss, executing query

# Second run (should use cache)
result2 = ds.filter(ds['x'] > 10).to_df()
# LOG: Cache hit, returning cached result

# If not caching when expected, check:
# - Are operations identical?
# - Is cache enabled? config.cache_enabled

Лучшие практики

1. Отлаживайте в среде разработки, а не в продакшене

# Development
config.enable_debug()
config.enable_profiling()

# Production
config.set_log_level(logging.WARNING)
config.set_profiling_enabled(False)

2. Перед выполнением крупных запросов используйте explain()

# Build query
query = ds.filter(...).groupby(...).agg(...)

# Check plan first
query.explain()

# If plan looks good, execute
result = query.to_df()

3. Сначала профилируйте, потом оптимизируйте

# Don't guess what's slow - measure it
config.enable_profiling()
result = your_pipeline()
get_profiler().report()

4. Проверьте SQL‑запрос, если результаты неверны

# View generated SQL
print(query.to_sql())

# Compare with expected SQL
# Run SQL directly in ClickHouse to verify

Сводка инструментов отладки

ИнструментКомандаРезультат
План выполненияds.explain()Шаги выполнения + SQL
Подробный план выполненияds.explain(verbose=True)+ Метаданные
Просмотр SQLds.to_sql()Строка SQL-запроса
Включить отладкуconfig.enable_debug()Детализированные логи
Включить профилированиеconfig.enable_profiling()Данные о времени выполнения
Отчет профилировщикаget_profiler().report()Сводка по производительности
Очистить профилировщикget_profiler().reset()Очистка данных о времени выполнения

Дальнейшие шаги