How to Speed Up dbt™ Testing with Turbo CI
Feb 26, 2026
How to Speed Up dbt Testing with Turbo CI
Every analytics engineer knows the frustration: you change a single column in a staging model, open a pull request, and then wait—sometimes 30 minutes or more—for the CI pipeline to rebuild and test the entire dbt™ project. That wait time isn't just annoying; it costs real money in warehouse compute and slows your team's ability to ship.
Turbo CI, built into Paradime Bolt, solves this by running and testing only the dbt™ models affected by a code change. In this guide, you'll learn why traditional dbt™ CI is slow, how Turbo CI works under the hood, how it compares to Slim CI and dbt Cloud™ CI, and how to set it up step by step.
Why dbt™ CI Runs Take Too Long
Before diving into the solution, it's worth understanding why dbt™ CI pipelines feel painfully slow in the first place.
Full Project Builds on Every Pull Request
The default CI behavior for many dbt™ projects is to run dbt build or dbt test against the entire project whenever a pull request is opened. If your project has hundreds or thousands of models, that means every single model gets compiled, materialized, and tested—regardless of whether it was touched by the PR.
This is the equivalent of recompiling an entire codebase because you edited one file. It wastes time, and it wastes compute.
Redundant Testing of Unchanged Models
Even when teams limit their CI to dbt test, they often test every model in the project. If you changed one model in your staging layer, there's no reason to re-run uniqueness or not-null tests on your fct_orders or dim_customers models that haven't been modified. But without state awareness, your CI pipeline doesn't know the difference.
Warehouse Compute Waste and Developer Delays
Slow CI has a compounding effect on your team:
Developer friction: Engineers wait for builds instead of shipping code. A 30-minute CI run means context switches, lost focus, and slower iteration cycles.
Merge bottlenecks: PRs stack up when CI queues are slow. If three people open PRs at the same time, each one waits in line for the full build to finish.
Compute costs: Unnecessary queries burn through warehouse credits. On Snowflake, BigQuery, or Databricks, every model materialization costs money—and running 500 models when only 5 changed is pure waste.
What Is Turbo CI for dbt™
Turbo CI is Paradime's optimized CI/CD feature that runs and tests only the dbt™ models affected by a code change. Instead of rebuilding your entire project on every pull request, Turbo CI uses state comparison and deferred runs to skip unchanged models entirely.
It's built into Paradime Bolt and designed as a drop-in replacement for slower, full-build CI approaches—whether you're coming from a hand-rolled GitHub Actions pipeline or dbt Cloud™ CI jobs.
Here's what makes Turbo CI different:
State-aware: Compares current code against the
manifest.jsonfrom the last successful production run to identify what actually changed.Deferred execution: References existing production tables for upstream models instead of rebuilding them, dramatically reducing build scope.
Lineage-driven: Uses column-level lineage diff to identify the true downstream impact of a change—including affected dbt™ models and BI dashboards.
How Turbo CI processes a pull request: only modified models and their dependents are built and tested.
How Turbo CI Accelerates dbt™ Testing
Let's break down the three core mechanics that make Turbo CI fast.
State-Based Model Selection
When a pull request is opened or updated, Turbo CI compares the current branch against the production manifest.json—an artifact generated by dbt™ that captures the compiled state of every model, test, seed, and snapshot in your project.
By diffing these two manifests, Turbo CI identifies exactly which nodes have been added, modified, or removed. It then builds only those models plus their downstream dependents using the state:modified+ selector.
Here's what the dbt™ command looks like under the hood:
The + operator after state:modified tells dbt™ to also include downstream children of modified models—so if you change stg_orders, any model that depends on it (like fct_orders or rpt_revenue) will also be rebuilt and tested.
Deferred Runs Against Production Artifacts
Deferred execution is the second key to Turbo CI's speed. When your CI pipeline needs to build fct_orders because its parent stg_orders was modified, it doesn't need to also rebuild every other parent of fct_orders—like stg_customers or stg_payments—if those haven't changed.
With the --defer flag, dbt™ resolves ref() calls for unmodified upstream models by pointing to their production tables instead of rebuilding them. This means your CI run reads from analytics_prod.stg_customers rather than materializing a fresh copy in a temporary CI schema.
Deferred runs skip rebuilding unchanged upstream models by referencing production artifacts directly.
The result: instead of building 50 models to test a change to one, you might build 3 or 4.
Column-Level Lineage Diff for Targeted Testing
Turbo CI doesn't just tell you which models changed—it shows you which columns are affected and traces their impact across your entire data stack.
When a PR is opened, Paradime automatically computes a column-level lineage diff between the base branch and the PR branch. This diff identifies:
Which columns in which dbt™ models were added, removed, or modified
All downstream dbt™ models that depend on those columns
BI-layer objects (like Tableau dashboards) that consume those downstream models
This impact analysis is published directly as a report in the pull request, letting reviewers assess the "blast radius" of a change before approving.
Turbo CI vs. Slim CI vs. dbt Cloud™ CI
If you're already familiar with Slim CI or dbt Cloud™ CI, you might be wondering how Turbo CI compares. Here's a breakdown.
Slim CI in dbt Core™
Slim CI is the open-source approach to efficient CI testing. It uses dbt™'s state:modified selector and --defer flag to build only changed models and reference production artifacts for upstream dependencies.
The challenge: you have to set it all up yourself. That means:
Storing and retrieving the production
manifest.json(typically via S3, GCS, or CI artifact storage)Configuring GitHub Actions, GitLab CI/CD, or another CI tool to download the manifest and run the dbt™ commands
Managing environment variables, warehouse credentials, and schema cleanup
It works, but it requires significant DevOps effort to maintain.
CI in dbt Cloud™
dbt Cloud™ provides native CI jobs that handle state comparison automatically. When you create a CI job, dbt Cloud™ tracks your production environment state and runs only modified models and their downstream dependencies.
Setup is simpler than DIY Slim CI—you don't need to manually store manifests or configure external CI tooling. However, dbt Cloud™ CI is limited in lineage visibility: it doesn't offer column-level lineage diff or cross-platform impact analysis into your BI layer.
Turbo CI in Paradime Bolt
Turbo CI is a managed, enhanced implementation of Slim CI principles with several additions:
Automatic deferred runs: No manual manifest wrangling. Paradime automatically fetches the latest
manifest.jsonfrom your production schedule.Column-level lineage diff: See exactly which columns are affected and trace impact into downstream models and BI dashboards—published directly in your PR.
Native alerting: Configure Slack, MS Teams, email, webhooks, or JIRA notifications for CI pass/fail events without external tooling.
Feature | Slim CI (dbt Core™) | dbt Cloud™ CI | Turbo CI (Paradime Bolt) |
|---|---|---|---|
State-based selection | Manual setup | Built-in | Built-in |
Deferred runs | Manual config | Supported | Native, automatic |
Column-level lineage diff | Not available | Not available | Included |
Real-time CI alerts | External tooling | Limited | Slack, Teams, JIRA, webhooks |
Unit test support | Requires setup | Supported | Supported |
How to Set Up Turbo CI in Paradime Bolt
Here's how to get Turbo CI running in four steps.
The four-step setup process for Turbo CI in Paradime Bolt.
Step 1. Connect Your Git Repository
Link your GitHub, GitLab, Azure DevOps, or Bitbucket repository to Paradime. This allows Bolt to listen for pull request events—creation, updates, and new commits—and trigger CI runs automatically.
For GitHub, install the Paradime GitHub app and authorize access to your dbt™ repository. Similar integrations are available for GitLab, Azure DevOps, and Bitbucket.
Step 2. Configure Your Deferred Production Environment
Turbo CI needs a baseline to compare against. Set up a production Bolt schedule that runs your dbt™ project on a regular cadence. This schedule generates the manifest.json artifact that Turbo CI uses for state comparison.
You'll also need a scheduler environment with the target set to ci. This tells dbt™ to materialize CI models in a temporary schema (e.g., paradime_turbo_ci_pr_123) rather than your production schema.
To keep models in the CI schema organized, add a custom generate_schema_name macro:
Step 3. Define Turbo CI Triggers and Commands
Create a Bolt schedule using Paradime's YAML-based configuration. Specify the deferred schedule (your production job), the dbt™ commands to run, and the notification channels.
Here's a complete example:
Key configuration points:
schedule: "OFF"— Turbo CI runs are triggered by PRs, not on a cron schedule.deferred_schedule_name— Points to your production schedule so Turbo CI knows whichmanifest.jsonto compare against.state:modified+— Tells dbt™ to build only modified models and their downstream dependents.
Step 4. Run Your First Turbo CI Build
Open a pull request against your main branch. Paradime will automatically detect the PR event, fetch the production manifest, identify modified models, and run the Turbo CI job.
You can verify the run by:
Checking the PR status check in GitHub/GitLab for pass/fail results
Navigating to the Bolt UI in Paradime and filtering runs by PR number (e.g.,
PR:183)Inspecting the run logs to confirm that only modified models and their dependents were built
If column-level lineage diff is enabled, you'll also see an impact analysis report posted directly in the PR.
Best Practices for Faster dbt™ CI Pipelines
Turbo CI gives you a fast foundation. Here are additional practices to make your CI pipeline even more effective.
Use Deferred Runs to Skip Redundant Builds
Deferred runs should be the default for all CI jobs—not just Turbo CI. There's no reason to rebuild upstream models that haven't changed. In dbt Core™, this means always including the --defer and --state flags:
In Paradime Bolt, deferred runs are configured declaratively in the schedule YAML and handled automatically—no flag management required.
Combine Unit Tests with Model Tests in CI
Starting with dbt™ v1.8, you can define unit tests in YAML to validate transformation logic against static inputs. Running both unit tests and schema tests (like unique, not_null, accepted_values) in CI catches a broader set of issues before merge.
Here's an example unit test that validates email validation logic:
Because dbt build runs models and tests in dependency order, a single command in your Turbo CI configuration handles both:
Enable Real-Time Alerts for Failed CI Runs
Don't make developers check the Bolt UI to find out their CI run failed. Connect Slack, MS Teams, or email to get instant notifications on failures—and optionally auto-create JIRA tickets for tracking.
In Paradime, this is configured directly in the schedule YAML:
This reduces mean time to resolution (MTTR) by surfacing failures the moment they happen.
Review Column-Level Lineage Before Merging
Before approving a PR, use the lineage diff report to understand the full downstream impact of the change. Ask these questions:
Which downstream models are affected?
Are any BI dashboards impacted?
Does the change add, remove, or rename columns that downstream consumers depend on?
This practice prevents breaking changes from reaching production and gives reviewers confidence to approve or request changes.
What a Modern dbt™ CI Pipeline Should Include
Use this checklist to evaluate your current CI pipeline against best practices:
State-based model selection: Only build and test what changed. Use
state:modified+to include downstream dependents.Deferred execution: Reference production artifacts for upstream models instead of rebuilding them. Use
--deferto point to the production manifest.Unit and schema tests: Validate transformation logic with unit tests and data quality with schema tests—on every PR.
Column-level impact analysis: Visualize which downstream columns, models, and dashboards are affected before merging.
Automated alerts: Notify the team instantly on failures via Slack, Teams, email, or JIRA. Don't rely on manual checking.
Pre-commit hooks: Catch linting and formatting issues before CI runs. Use tools like SQLFluff and dbt-checkpoint to enforce standards locally.
Here's an example .pre-commit-config.yaml to get started with local linting:
A complete modern dbt™ CI pipeline: from pre-commit hooks through Turbo CI to merge.
Start Running Turbo CI for Free in Paradime
Ready to stop waiting 30 minutes for every CI run? Turbo CI in Paradime Bolt is free to get started with—no credit card required.
If your team is migrating from dbt Cloud™, Paradime's dbt Cloud™ Importer lets you bring over all your jobs, schedules, and environments in a few clicks for zero-downtime migration.
FAQs About dbt™ Turbo CI
What is the difference between Turbo CI and Slim CI?
Turbo CI is Paradime's managed implementation of Slim CI principles. Both use state:modified selectors and deferred runs to build only changed models. The difference is that Turbo CI adds automatic deferred runs (no manual manifest management), column-level lineage diff (published directly in PRs), and native alerting via Slack, Teams, JIRA, and webhooks—eliminating the DevOps overhead required for Slim CI in dbt Core™.
Does Turbo CI work with dbt Core™ projects?
Yes. Turbo CI in Paradime Bolt works with any dbt Core™ project connected via Git, regardless of whether you previously used dbt Cloud™ or self-hosted dbt™. You connect your repository, configure a production schedule, and Turbo CI handles the rest.
How long does a typical Turbo CI run take compared to a full build?
Run times vary by project size, but Turbo CI typically completes in a fraction of the time of a full build. Teams that previously waited 30–50 minutes for full-project CI runs often see Turbo CI complete in 3–5 minutes because it only processes changed models and their downstream dependents.
Can Turbo CI be used with GitHub Actions or GitLab CI/CD?
Turbo CI is built into Paradime Bolt and triggers automatically on pull requests—no external CI/CD configuration required. You don't need GitHub Actions or GitLab CI/CD to run it. However, Bolt also offers API and webhook integrations for custom workflows, so you can incorporate Turbo CI into an existing CI/CD pipeline if needed.
Does Turbo CI support dbt™ unit tests?
Yes. Turbo CI runs dbt™ unit tests alongside model and schema tests when you use dbt build --select state:modified+. This means you can validate both transformation logic and data quality in every pull request.
Is Turbo CI included in Paradime's free tier?
Yes. Teams can get started with Turbo CI at no cost through Paradime's free plan—no credit card required. This makes it easy to evaluate Turbo CI on your project before scaling to a paid tier.