T-SQL vs Spark SQL no Microsoft Fabric: Diferenças e Funções Essenciais para Construir um Data Warehouse

Resumo

O Microsoft Fabric disponibiliza dois caminhos para construir um data warehouse sobre a mesma camada de armazenamento aberta, o OneLake: o Fabric Warehouse, que usa T-SQL com suporte completo a DDL/DML e transações ACID multi-tabela, e o Lakehouse, onde a ingestão e a transformação são feitas em Spark SQL e a leitura é exposta via um SQL analytics endpoint somente leitura. Este guia técnico compara as duas linguagens em suas origens, engines de execução, modelos de dados e casos de uso, detalha as funções essenciais do Spark SQL para construir as camadas bronze e silver de um DW — DDL de tabelas Delta, MERGE para carga incremental, window functions, agregações, funções de string/data e comandos de manutenção como OPTIMIZE e VACUUM — e fecha com uma arquitetura prática de referência, a medallion, mostrando onde T-SQL e Spark SQL se complementam em vez de competir.


1. Contexto: os dois caminhos SQL do Microsoft Fabric

O Microsoft Fabric é uma plataforma SaaS de analytics que unifica engenharia de dados, data warehouse, BI e ciência de dados sobre uma única camada de armazenamento, o OneLake. Um ponto central da arquitetura: todo dado é armazenado no formato aberto Delta Lake (arquivos Parquet + log transacional), o que permite que diferentes engines leiam o mesmo dado sem duplicação.

Para construir um data warehouse no Fabric, existem dois caminhos principais:

  • Warehouse (Fabric Data Warehouse) — item de warehousing desenvolvido primariamente com T-SQL, com suporte completo a DDL/DML, transações ACID multi-tabela, views materializadas, stored procedures e funções.
  • Lakehouse — item de engenharia de dados em que a escrita e a transformação são feitas com Apache Spark (Spark SQL, PySpark, Scala), e que provisiona automaticamente um SQL analytics endpoint — uma superfície T-SQL somente leitura sobre as tabelas Delta.

Entender a diferença entre T-SQL e Spark SQL é o primeiro passo para decidir onde e como modelar cada camada do seu DW.

2. O que são T-SQL e Spark SQL?

T-SQL (Transact-SQL) é a extensão proprietária da Microsoft do padrão SQL, originada no SQL Server e presente também no Azure SQL Database, Azure Synapse e no Fabric Warehouse. Além do SQL declarativo, oferece programabilidade (stored procedures, funções, triggers), controle transacional explícito (BEGIN TRAN/COMMIT/ROLLBACK), temp tables, CTEs, MERGE, COPY INTO e um vasto conjunto de funções built-in. No Fabric, o Warehouse "compartilha uma grande superfície baseada no SQL Database Engine, com suporte completo a transações ACID multi-tabela, views materializadas, funções e stored procedures" (Microsoft Learn).

Spark SQL é o módulo do Apache Spark para processamento de dados estruturados, apresentado no artigo seminal "Spark SQL: Relational Data Processing in Spark" (Armbrust et al., SIGMOD 2015). Ele traduz consultas SQL em planos de execução distribuídos, processados pelo otimizador Catalyst e pela engine Tungsten em um cluster. Trabalha sobre arquivos (Parquet, Delta, JSON, CSV) com schema-on-read, integra-se com DataFrames e linguagens como Python (PySpark) e Scala, e expõe centenas de funções built-in organizadas em categorias (agregação, strings, datas, arrays, maps, JSON etc.).

3. Principais diferenças entre T-SQL e Spark SQL

As diferenças vão muito além da sintaxe: elas refletem filosofias distintas — um engine relacional clássico, otimizado para consultas pontuais e transações, versus uma engine distribuída, otimizada para varreduras massivas e processamento em lote.

Dimensão T-SQL Spark SQL
Origem Microsoft — SQL Server (1989), evolução do Sybase Apache Spark (2015), projeto open source
Engine de execução SQL Database Engine: otimizador relacional, índices, execução otimizada para consultas Catalyst + Tungsten: engine distribuída em cluster, execução em memória
Modelo de dados Esquema rígido, constraints, índices, colunas tipadas Schema-on-read sobre arquivos (Parquet/Delta), metastore
Transações ACID completo, multi-tabela ACID via Delta Lake (por tabela) + time travel
Escalabilidade Vertical / MPP (paralelismo massivo) Horizontal elástica (scale-out)
Programabilidade Stored procedures, funções, views, triggers, temp tables DataFrames, notebooks, UDFs; sem stored procedures nativas
Superfície SQL Grande: MERGE, COPY INTO, CTEs aninhadas, TRUNCATE, hints Subset ANSI + funções para arrays, maps e JSON
Uso típico DW clássico, modelagem dimensional, BI, governança ETL/ELT, dados brutos e semi-estruturados, big data
No Microsoft Fabric Warehouse: DDL/DML completos + SQL analytics endpoint Lakehouse: escrita via Spark; leitura via SQL analytics endpoint (T-SQL read-only)

A leitura essencial da tabela: T-SQL é a linguagem do Warehouse (modelagem, governança, BI), enquanto Spark SQL é a linguagem do Lakehouse (ingestão, transformação em larga escala). No Fabric, os dois convivem sobre o mesmo dado Delta — não é uma escolha excludente, e sim complementar.

4. Funções principais do Spark SQL para construir um DW no Fabric

No Lakehouse, o Spark SQL é a ferramenta primária para as camadas de ingestão e transformação (bronze e prata). Estas são as funções e comandos essenciais, organizados por categoria:

4.1 DDL e gerenciamento de tabelas Delta

CREATE DATABASE dw_gold;

CREATE TABLE dw_gold.dim_cliente (
  cliente_id BIGINT,
  nome STRING,
  segmento STRING
) USING DELTA;

CREATE OR REPLACE TABLE dw_gold.dim_cliente ...;  -- recria mantendo histórico Delta
ALTER TABLE dw_gold.dim_cliente ADD COLUMN email STRING;
DROP TABLE IF EXISTS dw_gold.dim_cliente;

O padrão do Fabric é spark.sql.sources.default = delta, ou seja, tabelas criadas via Spark já nascem em Delta — com ACID, versionamento e time travel.

4.2 DML e carga incremental: MERGE (upsert)

O MERGE é a função mais importante para um DW: permite carregar dados novos atualizando registros existentes e inserindo os demais em uma única operação atômica.

MERGE INTO dw_gold.dim_cliente AS alvo
USING silver.clientes AS origem
ON alvo.cliente_id = origem.cliente_id
WHEN MATCHED THEN UPDATE SET
  alvo.nome = origem.nome,
  alvo.segmento = origem.segmento
WHEN NOT MATCHED THEN INSERT (cliente_id, nome, segmento)
  VALUES (origem.cliente_id, origem.nome, origem.segmento);

4.3 Transformação e modelagem: CTAS, joins e window functions

O padrão CREATE OR REPLACE TABLE AS SELECT (CTAS) é o equivalente Spark do SELECT INTO do T-SQL — ideal para materializar camadas prontas:

CREATE OR REPLACE TABLE dw_gold.fato_vendas AS
SELECT v.venda_id, v.cliente_id, v.produto_id, v.valor, v.data
FROM silver.vendas v
JOIN silver.clientes c ON v.cliente_id = c.cliente_id;

As window functions são indispensáveis para deduplicação e ranking — o padrão mais usado em DW é ROW_NUMBER() para manter apenas o registro mais recente:

SELECT * FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY data DESC) AS rn
  FROM silver.vendas
) WHERE rn = 1;

Outras úteis: RANK(), DENSE_RANK(), LAG(), LEAD(), NTILE().

4.4 Agregações

SELECT produto_id,
       SUM(valor)  AS receita,
       COUNT(*)    AS qtde_vendas,
       COUNT(DISTINCT cliente_id) AS clientes,
       APPROX_COUNT_DISTINCT(cliente_id) AS clientes_aprox  -- rápido em volumes gigantes
FROM dw_gold.fato_vendas
GROUP BY produto_id;

Também relevantes: AVG, MIN, MAX, COLLECT_LIST, COLLECT_SET, PERCENTILE_APPROX, CORR, STDDEV.

4.5 Strings, datas e condicionais (limpeza de dados)

SELECT UPPER(nome)                       AS nome_maiusculo,
       TRIM(email)                       AS email_limpo,
       REGEXP_REPLACE(cpf, '[^0-9]', '') AS cpf_somente_digitos,
       DATE_FORMAT(data, 'yyyy-MM-dd')   AS data_iso,
       DATEDIFF(CURRENT_DATE(), data)    AS dias_desde_venda,
       COALESCE(segmento, 'desconhecido') AS segmento_final
FROM silver.clientes;

Outras frequentes: CONCAT, CONCAT_WS, SUBSTRING, SPLIT, LOWER, REPLACE, LPAD/RPAD; DATE_ADD, ADD_MONTHS, LAST_DAY, DATE_TRUNC, TO_DATE, TO_TIMESTAMP, YEAR, MONTH; e IF, NULLIF, CASE WHEN.

4.6 Dados semi-estruturados (JSON, arrays, maps)

Diferencial do Spark SQL em relação ao T-SQL clássico — essencial quando o DW consome eventos ou APIs:

SELECT GET_JSON_OBJECT(payload, '$.evento') AS evento,
       FROM_JSON(payload, 'schema STRING, valor DOUBLE') AS dados_estruturados
FROM bronze.eventos;

SELECT cliente_id, item
FROM bronze.pedidos
LATERAL VIEW EXPLODE(itens) AS item;  -- transforma array em linhas

4.7 Otimização e manutenção Delta (específicas do Fabric)

OPTIMIZE dw_gold.fato_vendas ZORDER BY (data);  -- compacta arquivos e ordena
VACUUM dw_gold.fato_vendas RETAIN 168 HOURS;    -- remove versões antigas

-- Time travel: consultar versões históricas
SELECT * FROM dw_gold.fato_vendas VERSION AS OF 123;
SELECT * FROM dw_gold.fato_vendas TIMESTAMP AS OF '2026-09-01';

O Fabric também aplica otimizações automáticas (compactação de arquivos pequenos e layout de dados), mas OPTIMIZE + ZORDER BY continuam sendo o controle fino para tabelas de fato grandes.

5. Arquitetura prática: construindo o DW no Fabric (medallion)

A abordagem recomendada pela Microsoft é a arquitetura medallion, com três camadas:

  • Bronze (bruto) — dados exatamente como chegam, via Spark (notebooks, pipelines). Nada é alterado.
  • Silver (enriquecida) — limpeza, deduplicação, padronização de tipos e validações, feitas com Spark SQL (MERGE, window functions, funções de string/data).
  • Gold (curada) — modelagem dimensional (star schema: dimensões + fatos), pronta para BI. Pode ser materializada com Spark SQL no Lakehouse ou com T-SQL no Warehouse.

O fluxo típico: Spark SQL escreve bronze e silver no Lakehouse; a camada gold pode viver no Warehouse (se você quer DDL/DML completos, stored procedures e governança T-SQL) ou continuar no Lakehouse, consultada pelo SQL analytics endpoint — que expõe as tabelas Delta como objetos SQL somente leitura, permitindo views, funções, procedures e segurança granular, além de conexão direta com o Power BI (Direct Lake).

A documentação oficial resume a decisão: escolha Warehouse quando precisar de uma solução enterprise-scale com formato aberto, setup mínimo e dados estruturados/semi-estruturados; escolha Lakehouse quando tiver grandes volumes de dados heterogêneos e quiser Spark como ferramenta primária. Como ambos leem o mesmo Delta no OneLake, você pode começar em um e evoluir para o outro sem migração de dados.

6. Conclusão

T-SQL e Spark SQL não são concorrentes dentro do Fabric — são linguagens para momentos diferentes do mesmo pipeline. O T-SQL entrega o que um DW clássico exige: transações ACID multi-tabela, stored procedures, views materializadas e uma superfície madura para modelagem e governança. O Spark SQL entrega o que o mundo do lakehouse exige: processamento distribuído elástico, schema-on-read, funções nativas para dados semi-estruturados e integração com notebooks e DataFrames. Dominar as funções de transformação, agregação, MERGE e otimização Delta do Spark SQL é o que permite construir as camadas bronze e silver com qualidade — deixando o T-SQL brilhar na camada gold, onde o dado já está pronto para negócio.

Referências