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
- What is Fabric Data Warehouse? — Microsoft Learn
- T-SQL surface area in Fabric Data Warehouse — Microsoft Learn
- What is the SQL analytics endpoint for a lakehouse? — Microsoft Learn
- Lakehouse and Delta Tables — Microsoft Learn
- Implement Medallion Lakehouse Architecture in Fabric — Microsoft Learn
- Spark SQL, Built-in Functions — Apache Spark
- Spark SQL: Relational Data Processing in Spark — Armbrust et al., SIGMOD 2015
- Analyzing and Comparing Lakehouse Storage Systems — Jain et al., CIDR 2023
- Adaptive and Robust Query Execution for Lakehouses at Scale — Bu et al., VLDB 2024