@@ -1186,6 +1186,7 @@ def render(
11861186 end : t .Optional [TimeLike ] = None ,
11871187 execution_time : t .Optional [TimeLike ] = None ,
11881188 expand : t .Union [bool , t .Iterable [str ]] = False ,
1189+ use_project_index : bool = False ,
11891190 ** kwargs : t .Any ,
11901191 ) -> exp .Expr :
11911192 """Renders a model's query, expanding macros with provided kwargs, and optionally expanding referenced models.
@@ -1198,12 +1199,20 @@ def render(
11981199 expand: Whether or not to use expand materialized models, defaults to False.
11991200 If True, all referenced models are expanded as raw queries.
12001201 If a list, only referenced models are expanded as raw queries.
1202+ use_project_index: Whether to use the persistent project index to load and
1203+ render only the target model and its transitive upstream dependencies.
12011204
12021205 Returns:
12031206 The rendered expression.
12041207 """
12051208 execution_time = execution_time or now ()
12061209
1210+ if not self ._loaded :
1211+ target_fqns = (
1212+ {self ._node_or_snapshot_to_fqn (model_or_snapshot )} if use_project_index else None
1213+ )
1214+ self .load (model_fqns = target_fqns , use_project_index = use_project_index )
1215+
12071216 model = self .get_model (model_or_snapshot , raise_if_missing = True )
12081217
12091218 if expand and not isinstance (expand , bool ):
@@ -1232,7 +1241,19 @@ def render(
12321241 )
12331242 return next (pandas_to_sql (t .cast (pd .DataFrame , df ), model .columns_to_types ))
12341243
1235- snapshots = self .snapshots
1244+ if use_project_index :
1245+ # Only the target model and its transitive upstream dependencies can be referenced
1246+ # by the rendered query, so there is no need to create snapshots for the rest.
1247+ upstream_fqns = {model .fqn , * self .dag .upstream (model .fqn )}
1248+ upstream_models : UniqueKeyDict [str , Model ] = UniqueKeyDict (
1249+ "models" , {fqn : m for fqn , m in self ._models .items () if fqn in upstream_fqns }
1250+ )
1251+ snapshots = self ._snapshots (
1252+ upstream_models ,
1253+ include_standalone_audits = False ,
1254+ )
1255+ else :
1256+ snapshots = self .snapshots
12361257 deployability_index = DeployabilityIndex .create (snapshots .values (), start = start )
12371258
12381259 return model .render_query_or_raise (
@@ -2986,9 +3007,13 @@ def _get_engine_adapter(self, gateway: t.Optional[str] = None) -> EngineAdapter:
29863007 return self .engine_adapter
29873008
29883009 def _snapshots (
2989- self , models_override : t .Optional [UniqueKeyDict [str , Model ]] = None
3010+ self ,
3011+ models_override : t .Optional [UniqueKeyDict [str , Model ]] = None ,
3012+ include_standalone_audits : bool = True ,
29903013 ) -> t .Dict [str , Snapshot ]:
2991- nodes = {** (models_override or self ._models ), ** self ._standalone_audits }
3014+ nodes : t .Dict [str , Node ] = dict (models_override or self ._models )
3015+ if include_standalone_audits :
3016+ nodes .update (self ._standalone_audits )
29923017 snapshots = self ._nodes_to_snapshots (nodes )
29933018 stored_snapshots = self .state_reader .get_snapshots (snapshots .values ())
29943019
0 commit comments