dbt

Junior

Что на самом деле внутри dbt run_results.json, и почему его стоит читать напрямую?

Каждый запуск dbt пишет этот файл в target/, открываете вы его или нет. В нём уже есть ответ на вопрос «какая модель медленная».

Читать на:
execution_time thread_id / параллелизм status
Сколько сигнала несёт каждое поле для расследования медленной модели — не измеренная разбивка.

Не нужен ни аккаунт dbt Cloud, ни история запросов в хранилище, ни дополнительная инструментация — в target/run_results.json уже есть тайминг по каждой модели за каждый запуск с момента последней очистки target.

Форма файла: один объект результата на ноду

Массив results содержит по одной записи на каждую модель, тест или seed, который выполнялся: unique_id, status («success», «error», «skipped»), execution_time в секундах, thread_id и массив timing, разбивающий это время на фазы compile и execute с реальными таймстемпами.

# 10 самых медленных моделей из последнего запуска jq -r '.results[] | [.unique_id, .execution_time] | @tsv' target/run_results.json | sort -k2 -n -r | head -10

Thread ID говорит о параллелизме, а не только об идентификаторе

dbt выполняет модели параллельно, в пределах переданного --threads. Если самые медленные модели у вас имеют один и тот же thread_id и выполнялись строго последовательно, а не параллельно с чем-то ещё — это проблема формы DAG (цепочка зависимостей, вынуждающая последовательное выполнение), а не медленности конкретной модели. Стоит проверить, прежде чем тратить вечер на оптимизацию SQL, который никогда и не был узким местом.

Чего он не расскажет

Только тайминг, не стоимость. В run_results.json нет данных о прочитанных байтах или потраченных кредитах — для оценки стоимости вычислений в Snowflake или BigQuery всё равно нужна собственная история запросов хранилища, связанная с запуском dbt через комментарий запроса или query ID, если ваш адаптер его логирует. Это реальный пробел, а не то, что стоит замалчивать.

Это именно тот файл, который читают правила opti-pipe для dbt — не нужен ни аккаунт dbt Cloud, ни доступ к хранилищу, только файл, который уже записал на диск ваш последний dbt run.

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

Загрузите реальный event log Spark, run_results.json от dbt или экспорт метрик Flink — и получите конкретные рекомендации, которые нужно одобрить, а не ещё одно эмпирическое правило.