From 2b4187bfff41a5f44430690ae9cd873211871da7 Mon Sep 17 00:00:00 2001 From: 0xRobin <83790096+0xRobin@users.noreply.github.com> Date: Thu, 14 May 2026 13:21:23 +0200 Subject: [PATCH] Short-circuit list_schemas to skip ~500x query storm in before_run dbt-core's RunTask.create_schemas builds required_databases via Set[BaseRelation] from .include(database=True, schema=False, identifier=False). BaseRelation.__hash__ is hash(render()) but __eq__ compares to_dict(); the underlying schema/identifier fields aren't cleared so all entries hash same but compare unequal, and the set keeps every one. dbt then dispatches one adapter.list_schemas(database) future per (db, schema) pair touched by the run -- ~500 identical 'select schema_name from .information_schema.schemata' queries during before_run on spellbook hourly (~5 min wall time). Always return [] here. dbt-core falls through to dispatching create_schema for each unique (db, schema) string tuple (that dedup uses string sets, not BaseRelation, and works correctly). Update trino__create_schema to use CREATE SCHEMA IF NOT EXISTS for the hive branch so the dispatch is a metastore-cheap no-op (single getDatabase call) for existing schemas instead of a full information_schema.schemata scan. Upstream fix in dbt-adapters: https://github.com/dbt-labs/dbt-adapters/pull/1930 Drop this workaround once #1930 ships in our pinned dbt-adapters version. --- dbt_macros/dune/no-relation-listing.sql | 4 ++-- dbt_macros/dune/schema.sql | 2 +- dbt_subprojects/tokens/models/_dev/tokens_dev_table.sql | 4 ++-- dbt_subprojects/tokens/models/_dev/tokens_dev_view.sql | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dbt_macros/dune/no-relation-listing.sql b/dbt_macros/dune/no-relation-listing.sql index 4b4387a9af7..396ff248322 100644 --- a/dbt_macros/dune/no-relation-listing.sql +++ b/dbt_macros/dune/no-relation-listing.sql @@ -13,11 +13,11 @@ {%- endmacro %} {% macro list_schemas(database) -%} - {% do log(target) %} {%- if (var('no-relation-listing', 'false').lower() == 'true') or (target.profile_name == 'spellbook-local') -%} {{ return([]) }} {%- else -%} - {{ return(adapter.dispatch('list_schemas')(database)) }} + {# Workaround for https://github.com/dbt-labs/dbt-adapters/issues/1929 -- drop once fixed. #} + {{ return([]) }} {%- endif -%} {%- endmacro %} diff --git a/dbt_macros/dune/schema.sql b/dbt_macros/dune/schema.sql index 19cafae1106..4e0fc1c9dbd 100644 --- a/dbt_macros/dune/schema.sql +++ b/dbt_macros/dune/schema.sql @@ -7,7 +7,7 @@ {%- if target.database == 'dune' -%} CREATE SCHEMA IF NOT EXISTS {{ relation }} {%- else -%} - CREATE SCHEMA {{ relation }} WITH (location = 's3a://{{s3_bucket()}}/') + CREATE SCHEMA IF NOT EXISTS {{ relation }} WITH (location = 's3a://{{s3_bucket()}}/') {%- endif -%} {% endcall %} {% endmacro %} diff --git a/dbt_subprojects/tokens/models/_dev/tokens_dev_table.sql b/dbt_subprojects/tokens/models/_dev/tokens_dev_table.sql index 8f976594594..99fa22a48a5 100644 --- a/dbt_subprojects/tokens/models/_dev/tokens_dev_table.sql +++ b/dbt_subprojects/tokens/models/_dev/tokens_dev_table.sql @@ -4,5 +4,5 @@ file_format = 'delta' ) }} ---stamp 1 -select 1 as stamp +--stamp 2 +select 2 as stamp diff --git a/dbt_subprojects/tokens/models/_dev/tokens_dev_view.sql b/dbt_subprojects/tokens/models/_dev/tokens_dev_view.sql index 38f26e989f4..15229754170 100644 --- a/dbt_subprojects/tokens/models/_dev/tokens_dev_view.sql +++ b/dbt_subprojects/tokens/models/_dev/tokens_dev_view.sql @@ -3,5 +3,5 @@ materialized = 'view' ) }} ---stamp 1 -select 1 as stamp +--stamp 2 +select 2 as stamp