Why does DBT create temporary table for incremental updates?

The problem i’m having is that my incremental updates are not very performant. I am using snowflake and trying to understand why dbt creates a temporary table from the incremental update and then merges it in to the destination in a subsequent query. Why not do this all in one query? Why is it necessary to materialize the incremental update as a table before merge?

create or replace temporary table DATABASE_NAME.SCHEMA_NAME.table_name__dbt_tmp  as
      (select * from(