El motor relacional T-SQL enterprise-grade de Fabric: modelado dimensional, Warehouse vs SQL analytics endpoint, COPY INTO, zero-copy clones, time travel, seguridad granular y monitoring. 🌸
IntermedioAvanzado
🎯
1. Objetivos y encaje en el DP-700
¿Qué te enseña este módulo?
Este módulo cubre el Fabric Data Warehouse — el motor relacional T-SQL enterprise-grade. Los objetivos oficiales:
Describir conceptos de data warehouse y los fundamentos del modelado dimensional.
Crear tablas, cargar datos y entender los métodos de ingesta.
Consultar y transformar datos con T-SQL y el visual query editor.
Modelar los datos del warehouse para reporting y consumo downstream.
Asegurar y monitorizar un data warehouse.
Peso en el examen DP-700
El Warehouse aparece principalmente en los dominios 1 y 2:
🌸 Buenas noticias si vienes de SQL Server: si ya sabes T-SQL, ya sabes el 90% de este módulo. Fabric Warehouse tiene sintaxis muy familiar. Las diferencias son: gestión de infra automatizada, storage en Delta y algunas features nuevas (clones, time travel).
🏛️
2. ¿Qué es un data warehouse?
Definición
Un data warehouse es un store centralizado y estructurado diseñado para queries analíticas y reporting.
Diferencia crítica con las bases de datos operacionales:
OLTP (databases operacionales): manejan transacciones day-to-day del negocio.
OLAP (data warehouses): consolidan data de múltiples sources en un formato optimizado para analytics.
Los 4 pasos de un DW moderno
Data ingestion — mover data de sources al warehouse.
Data storage — almacenar en formato optimizado para analytics.
Data processing — transformar para consumo por analytical tools.
Data analysis y delivery — analizar y entregar insights al negocio.
¿Cómo se diseñan?
Los warehouses contienen tablas organizadas en un schema optimizado para multidimensional modeling.
La idea: agrupar numerical data related to events por diferentes attributes. Ejemplos: total amount de sales orders que ocurrieron en una fecha específica, ventas en una tienda concreta, o métricas por región o customer.
🌸 Analogía kawaii: piénsalo como una biblioteca ordenada. OLTP = ficheros de operaciones diarias (mesa de trabajo, apuntes rápidos). Warehouse = estanterías organizadas por tema, categoría y fecha (fácil buscar patrones históricos).
📊
3. Dimensional modeling: fact + dimension tables
La técnica del modelado dimensional
Organizamos las tablas en dos tipos fundamentales: fact tables (mediciones) y dimension tables (contexto).
Fact tables
Contienen la numerical data que quieres analizar.
Características:
📊 Típicamente muchas rows.
🎯 Primary source para analysis.
📏 Contienen granular measurements de events.
🔑 Contienen foreign keys a dimension tables.
Ejemplos:
FactSales: cada row = una línea de venta con sales_amount, quantity.
FactStockPrices: cada row = una lectura de precio con open_price, close_price.
FactWebEvents: cada row = un pageview con duration, bytes_transferred.
Dimension tables
Contienen descriptive information sobre los datos en las fact tables.
Características:
📚 Típicamente pocas rows (comparadas con fact).
📝 Muchas columnas descriptivas.
🎨 Proveen contexto.
🔑 Contienen keys que se referencian desde facts.
Ejemplos:
DimCustomer: name, region, segment.
DimProduct: category, brand, supplier.
DimDate: year, quarter, month, day, day_of_week.
DimStore: store_name, location, size.
🌷 La analogía del libro de contabilidad: la fact table es el ledger con transactions numéricas (dinero, cantidades). Las dimension tables son los libros de referencia (clientes, productos) que te explican quién compró qué y cuándo.
🔑
4. Surrogate keys vs alternate keys
Dos tipos de keys
Una dimension table típicamente incluye dos key columns:
A) Surrogate key
Unique identifier específico del warehouse.
Suele ser un integer generado automáticamente por el DBMS.
No tiene business meaning.
B) Alternate key (también llamada natural key o business key)
✅ Independiente del source system (si el source cambia, la surrogate no).
✅ Performance: los integer joins son más rápidos.
✅ Habilita SCD Type 2 (necesitas surrogate para tracking versions).
Alternate key:
✅ Traceability entre warehouse y source.
✅ Debugging: puedes hacer lookup del source si algo va raro.
✅ Business queries: los users saben product codes, no surrogate keys.
Ejemplo
CREATE TABLE dbo.DimCustomer (
CustomerKey INT NOT NULL, -- Surrogate key (warehouse-generated)
CustomerAltKey NVARCHAR(10) NOT NULL, -- Alternate key (from source)
CustomerName NVARCHAR(100) NOT NULL,
Region NVARCHAR(50) NULL
);
CustomerKey = surrogate (ej: 1, 2, 3...).
CustomerAltKey = alternate (ej: "CUST-00123" desde el CRM).
La fact table usa la surrogate
CREATE TABLE dbo.FactSales (
SalesKey INT NOT NULL,
CustomerKey INT NOT NULL, -- FK a DimCustomer.CustomerKey (surrogate)
ProductKey INT NOT NULL, -- FK a DimProduct.ProductKey (surrogate)
DateKey INT NOT NULL, -- FK a DimDate.DateKey
SalesAmount DECIMAL(10,2) NOT NULL,
Quantity INT NOT NULL
);
Joins más rápidos (integer keys) e independientes del source.
📐
5. Special dimensions: time y SCD
Time dimensions
Las time dimensions proveen información sobre el time period en que ocurrió un event. Permiten a los analistas agregar data over temporal intervals.
Ejemplo: DimDate con columnas DateKey (ej: 20260315 formato yyyymmdd), Date, Year, Quarter, Month, MonthName, Day, DayOfWeek, IsWeekend, FiscalYear y FiscalQuarter.
Por qué son especiales
Reutilizables: una DimDate sirve para múltiples facts.
Hierarchies naturales: Year → Quarter → Month → Day.
Pre-populated: se rellena con todas las fechas del rango.
Business calendars: fiscal years, holidays, working days.
Slowly Changing Dimensions (SCD)
Ya las vimos en el Módulo 4. Recordatorio: SCD = tracking de changes to dimension attributes over time. Ejemplos: un customer cambia de dirección, un product cambia de precio, una store cierra y reabre.
Por qué importan en el warehouse
Permiten analizar y entender los cambios de los datos a lo largo del tiempo: comparar sales de un customer cuando estaba en su region antigua vs la nueva, y hacer analytics históricos que respetan el estado del dato en el momento.
Los 3 tipos principales (repaso)
SCD Type 1: sobrescribir (sin historia).
SCD Type 2: versionado con Valid_From, Valid_To, Is_Current.
SCD Type 3: mantener previous_value en columna separada.
⭐
6. Star schema vs Snowflake schema
La denormalización en warehouse
En la mayoría de transactional databases operacionales, la data está normalizada para reducir duplication.
En un data warehouse, la dimension data está DENORMALIZADA para reducir el número de joins requeridos por las queries. Esto es una decisión intencional para performance analytics.
Star schema
Star schema = fact table conectada directamente a dimension tables:
En vez de todo el detalle en DimProduct, se separa en DimCategory y DimSupplier.
Características:
✅ Menos data duplication en storage.
⚠️ Más joins para queries → más lento.
⚠️ Más complejo para analistas.
Cuándo cada uno
Star schema ✅ (mayoría de casos): cuando la performance analítica es prioridad, los analistas consumen directamente, hay reports de Power BI, o es un data warehouse tradicional.
Snowflake schema (casos específicos): cuando el storage cost es prioridad muy alta, las dimensions tienen muchos niveles/attributes, o la data se actualiza frecuentemente en dimensions.
📌 🎯 Recomendación oficial: Microsoft recomienda star schema para Fabric. Es lo estándar y funciona mejor con Direct Lake semantic models, Copilot para Data Warehouse y Fabric IQ data agents.
🏛️
7. Fabric Data Warehouse: características clave
Definición
Un Fabric data warehouse es un fully managed, enterprise-scale relational database construido sobre OneLake.
Provee full transactional T-SQL capabilities:
DDL statements: CREATE, ALTER, DROP.
DML statements: INSERT, UPDATE, DELETE, MERGE.
Full ACID compliance para data consistency.
Storage en OneLake
La data se almacena en open Delta format en OneLake:
✅ Otros Fabric workloads pueden acceder a la misma data sin duplication.
✅ Cross-workload interoperability.
✅ No lock-in del formato.
Interfaces
Usas T-SQL para crear tablas, cargar data, construir views y stored procedures y hacer transformaciones. Todo con la experiencia familiar de SQL Server.
Key capabilities
A) Full T-SQL support: DDL y DML statements, MERGE para upsert scenarios, sintaxis familiar de SQL Server.
B) Fully managed: NO hay infraestructura que configurar. El compute escala automáticamente e independientemente del storage.
C) OneLake integration: data en Delta format, accesible por otros Fabric workloads sin duplication.
D) Cross-database querying: query across warehouses y lakehouses sin copiar data, con three-part naming (database.schema.table) para joins cross-source.
E) Familiar tooling: conecta con SQL Server Management Studio (SSMS), Azure Data Studio, VS Code con la extensión MSSQL o cualquier SQL client vía TDS connections.
F) Copilot assistance: Copilot for Data Warehouse genera SQL desde natural language, completa código mientras escribes y explica o arregla queries existentes en el SQL editor.
🎯
8. Warehouse vs SQL analytics endpoint (CRÍTICO)
Este es probablemente el tema MÁS examinable del módulo. Lo tienes que dominar completamente.
Los dos items SQL en Fabric
A) Warehouse
Item standalone.
Native warehouse tables (creadas por ti con CREATE TABLE).
Full read/write.
B) SQL analytics endpoint
Endpoint auto-generado de un Lakehouse.
Consulta Lakehouse Delta tables.
Read-only.
Tabla comparativa oficial
Capability
Warehouse
SQL analytics endpoint
Read data
✅ Sí
✅ Sí
Write data (INSERT, UPDATE, DELETE, MERGE)
✅ Sí
❌ No
Create tables (DDL)
✅ Sí
❌ No
Create views y stored procedures
✅ Sí
✅ Sí
Data source
Native warehouse tables
Lakehouse Delta tables
🎯 Cuándo usar cada uno
Warehouse ✅ cuando necesitas full read/write T-SQL, quieres INSERT/UPDATE/DELETE/MERGE, necesitas crear tablas vía CREATE TABLE, el equipo es T-SQL first, o haces BI empresarial tradicional.
SQL analytics endpoint ✅ cuando necesitas read-only SQL access a data de Lakehouse, ya tienes data en Lakehouse (poblada por Spark, dataflows, etc.), solo quieres queries y views sobre esa data, y no necesitas modificar datos.
🎯 Diferencia CRÍTICA que cae en el examen: puedes crear views y stored procedures en AMBOS. Pero solo puedes crear tablas en el Warehouse. Y solo puedes modificar data en el Warehouse. Esta distinción cae constantemente.
Los dos usan T-SQL syntax. La sintaxis es igual; lo que cambia es qué operaciones permite.
🛠️
9. Crear un warehouse
Dos formas
A) Desde el create hub: New → Warehouse. Provee nombre.
B) Desde un workspace: New item → Warehouse.
Después de crear
El warehouse empieza vacío. Puedes añadir tablas, views, stored procedures y otros objects. Todo desde el SQL query editor en el Fabric portal.
Auto-created objects
Cuando creas un warehouse, se crea automáticamente un default schema dbo, y hay sample data disponible opcionalmente (Sample warehouse).
Hay varias formas de cargar data: COPY INTO ⭐, OPENROWSET, Pipelines y Dataflows y cross-database queries (para no duplicar). Vamos uno por uno.
COPY INTO (el más común)
Bulk load de external files (CSV, Parquet) en Azure storage a warehouse tables.
COPY INTO dbo.Region
FROM 'https://mystorageaccount.blob.core.windows.net/data/Region.csv'
WITH (
FILE_TYPE = 'CSV',
CREDENTIAL = (
IDENTITY = 'Shared Access Signature',
SECRET = 'xxx'
),
FIRSTROW = 2
)
GO
Options importantes:
FILE_TYPE: CSV, PARQUET.
CREDENTIAL: SAS, managed identity, service principal.
FIRSTROW: skip header row.
FIELDTERMINATOR, ROWTERMINATOR: para CSVs custom.
PARSER_VERSION: '1.0' o '2.0' (recomendado 2.0).
OPENROWSET
Consulta ficheros directamente desde external storage o OneLake locations para ad hoc analysis o ingestion, sin crear tablas primero.
Uso típico: exploración rápida antes de decidir schema.
Pipelines y Dataflows
Ya los vimos en los Módulos 5 y 6. Recordatorio: Data Factory pipelines para orchestrated data movement y Dataflows Gen2 para transformation low-code. Ambos pueden tener Warehouse como destination.
Cross-database queries
Si ya tienes tablas en Lakehouse y quieres consultarlas desde el Warehouse sin copiar, usa cross-database queries con three-part naming:
SELECT *
FROM [MyLakehouse].[dbo].[sales_table]
Sin copiar data. Vemos esto a fondo en la sección específica.
🎯 Cuándo cada método
Caso
Método
Bulk load de CSV/Parquet en storage
COPY INTO
Ad-hoc query de fichero externo
OPENROWSET
Orquestación multi-step con dependencias
Pipeline
Transformation low-code Power Query
Dataflow Gen2
Query cross-item sin copiar
Cross-database queries
🏗️
11. Crear tablas y cargar data
CREATE TABLE
Usa T-SQL CREATE TABLE con columnas apropiadas para analytics workloads:
CREATE TABLE dbo.DimCustomer (
CustomerKey INT NOT NULL,
CustomerAltKey NVARCHAR(10) NOT NULL,
CustomerName NVARCHAR(100) NOT NULL,
Region NVARCHAR(50) NULL
);
GO
CREATE TABLE dbo.FactSales (
SalesKey INT NOT NULL,
CustomerKey INT NOT NULL,
ProductKey INT NOT NULL,
DateKey INT NOT NULL,
SalesAmount DECIMAL(10,2) NOT NULL,
Quantity INT NOT NULL
);
GO
Data types recomendados
Elige types que balanceen precisión con storage efficiency:
Type
Uso
INT
Key columns (surrogate, alternate integer)
BIGINT
Keys con muchos valores
NVARCHAR(n)
Text con special characters (Unicode)
VARCHAR(n)
Text ASCII simple (menos storage)
DECIMAL(p,s)
Financial values (precisión exacta)
FLOAT / REAL
Scientific values (aproximado)
DATE
Solo fecha
DATETIME2
Fecha + hora con precisión
BIT
Booleanos (0/1)
⚠️ Limitations importantes: Fabric Warehouse NO soporta todos los data types de SQL Server. Faltan: NTEXT, TEXT (deprecated), IMAGE, SQL_VARIANT, GEOGRAPHY, GEOMETRY, XML, HIERARCHYID, MONEY y SMALLMONEY (usa DECIMAL).
Constraints
Fabric Warehouse soporta:
✅ NOT NULL / NULL.
✅ PRIMARY KEY NONCLUSTERED NOT ENFORCED (informational only).
✅ UNIQUE NOT ENFORCED.
✅ FOREIGN KEY NOT ENFORCED.
⚠️ NOT ENFORCED: Fabric NO enforcea constraints. Los mantiene como metadata para el optimizer, pero tú eres responsable de mantener la data integrity.
🎨
12. Staging tables pattern
El pattern
Un pattern común en data warehousing: aterrizar raw data en staging tables antes de transformar y cargar en las dimension y fact tables finales.
Las staging tables replican la estructura del source data y actúan como un temporary holding area.
Beneficios
✅ Aislar el source data del modelo final.
✅ Aplicar business rules durante el load (no en query).
✅ Key lookups entre source keys y surrogate keys.
✅ Data validation antes de commit a la tabla final.
✅ Retry logic: si algo falla, el source data queda intacto en staging.
✅ Auditability: histórico de qué data se cargó cuándo.
Ejemplo típico
-- 1. Load raw data en staging con COPY INTO o pipeline
COPY INTO dbo.StgSales FROM '...';
-- 2. Transform + insert en fact table con key lookups
INSERT INTO dbo.FactSales (SalesKey, CustomerKey, ProductKey, DateKey, SalesAmount, Quantity)
SELECT
s.OrderID,
c.CustomerKey, -- Lookup surrogate desde alternate
p.ProductKey, -- Lookup surrogate desde alternate
d.DateKey,
s.Amount,
s.Qty
FROM dbo.StgSales AS s
INNER JOIN dbo.DimCustomer AS c ON s.CustomerID = c.CustomerAltKey
INNER JOIN dbo.DimProduct AS p ON s.ProductID = p.ProductAltKey
INNER JOIN dbo.DimDate AS d ON s.OrderDate = d.DateValue;
GO
Conventional naming
Prefixes comunes:
Stg o Staging: staging tables (StgSales, StagingCustomer).
Dim: dimensions.
Fact: facts.
Bridge o Br: bridge/mapping tables.
Aggr o Agg: aggregated summary tables.
🎨
13. Zero-copy table clones (feature moderna)
Este es un tema estrella del módulo. Muy examinable.
¿Qué es?
Fabric ofrece near-instantaneous zero-copy clones con minimal storage costs.
Un zero-copy clone crea una réplica de la tabla copiando solo la metadata, mientras sigue referenciando los mismos data files en OneLake.
✅ Metadata copiada.
❌ Underlying data NO copiada (referenciada).
⚡ Creación near-instant.
💾 Minimal storage cost.
Sintaxis
-- Clone en el mismo schema
CREATE TABLE dbo.Employee AS CLONE OF dbo.EmployeeUSA;
-- Clone cross-schema
CREATE TABLE dev.Employee AS CLONE OF prod.EmployeeUSA;
-- Clone as-of past point-in-time
CREATE TABLE dbo.Employee_Yesterday
AS CLONE OF dbo.Employee
AT (TIMESTAMP AS OF '2026-04-14T10:00:00');
Casos de uso
Development y testing: crear clones para playground sin duplicar data.
Data recovery: recuperar tras un failed release o data corruption.
Historical reporting: preservar data en puntos concretos del tiempo.
Business milestones: snapshot en momentos clave.
A/B testing: comparar 2 versiones sin coste de duplicación.
Independencia post-clone
Después de crear, el clone es independiente y separado:
Los cambios en el source NO afectan al clone.
Los cambios en el clone NO afectan al source.
Puedes dropear cualquiera sin afectar al otro.
🎯 Copia security features (muy importante): los clones también copian Row-Level Security (RLS), Column-Level Security (CLS) y Dynamic Data Masking (DDM). Sin necesidad de re-aplicar policies después del clone.
Time travel + clones
Puedes crear clones as-of un past point-in-time dentro del retention period. Es una capability muy poderosa.
Multiple tables at once
Puedes clonar múltiples tablas a la vez con un solo comando, útil para clonar sets de tablas relacionadas al mismo past point-in-time.
Sin límite en clones
No hay límite en el número de clones que puedes crear (dentro y entre schemas).
Storage cost
Como no copian data, el storage cost es mínimo: solo cuenta el metadata overhead (pequeño) y los data files están compartidos con el source. Cuando modificas el clone, se generan nuevos files solo para las modificaciones (Delta lo maneja transparentemente).
⏰
14. Time travel con FOR TIMESTAMP AS OF
¿Qué es time travel?
Time travel en el data warehouse = capability low-cost y eficiente para consultar rápidamente versiones anteriores de la data.
Fabric permite recuperar past states de dos formas:
A nivel de statement con FOR TIMESTAMP AS OF.
A nivel de tabla con CLONE TABLE.
Sintaxis básica
SELECT *
FROM [dbo].[dimension_customer] AS DC
OPTION (FOR TIMESTAMP AS OF '2026-03-13T19:39:35.28');
-- March 13, 2026 at 7:39:35.28 PM UTC
Devuelve la data exactamente como existía en ese timestamp.
Format del timestamp
Format: YYYY-MM-DDTHH:MM:SS[.fff]. Solo UTC — no otras timezones.
Puedes usar CONVERT con style 126 para obtener el datetime format necesario:
Los resultados son inherentemente read-only: ❌ NO puedes hacer INSERT, UPDATE ni DELETE con el time travel query hint.
FOR TIMESTAMP AS OF afecta al statement ENTERO: incluye todas las warehouse tables del join. Todas ven data del mismo point-in-time.
Puedes usarla en:
✅ SELECT statements.
✅ Views (consultando views existentes, no creando views con time travel).
✅ Stored procedures.
NO puedes:
❌ Usar time travel para crear views as-of past point-in-time.
❌ Usarla más de una vez dentro de un SELECT statement.
❌ Afecta a session-scoped temp tables (#temp_table).
7 casos de uso oficiales
Stable reporting: reports basados en query results as-of la tarde anterior, mientras el ETL corre en background.
Historical trend analysis: comparar data en past time frames.
Analysis y comparison: identificar root cause con perspectiva histórica.
Performance analysis: identificar trends de degradación.
Audit y compliance: navegar el histórico para regulaciones de compliance.
Reproducir ML models: replicar exactamente los datasets usados para entrenar.
Cross-warehouse time travel: consultar tablas as-of un punto concreto across múltiples warehouses del mismo workspace.
Data retention
Todos los inserts, updates y deletes al warehouse se retienen dentro del retention period configurado. Esto habilita las time travel queries y los clones as-of past. Ver la siguiente sección.
⏳
15. Data retention
Default y configurable
Default: data history retenida durante 30 días calendario. Configurable: desde 1 hasta 120 días.
Impacto en features
El retention period impacta a:
Time travel: solo puedes ir atrás dentro del retention.
Clones as-of past: mismo límite.
Recovery: solo posible dentro del retention.
Cómo configurar
Se configura a nivel warehouse. Ver docs oficiales para la sintaxis exacta (varía).
Consideraciones: mayor retention = más storage cost; menor retention = menos capabilities de time travel; y el compliance puede requerir un retention mínimo.
⚠️ Ojo cosita: el retention NO reemplaza una backup strategy. El retention es para rollback rápido y time travel. Un backup completo (horizontes más largos) requiere estrategia separada.
💻
16. Query con SQL query editor
La interfaz
El SQL query editor provee una experiencia que incluye IntelliSense, code completion, syntax highlighting, client-side parsing y validation. Muy familiar para quienes vienen de SSMS o Azure Data Studio.
Cómo crear una query
Menu → New SQL query. O el botón en el ribbon.
Copilot for Data Warehouse
Disponible en el editor. Ayuda a generar queries desde natural language, completar código mientras escribes, explicar queries existentes y arreglar queries que fallan.
Ejemplo natural language
Usuario: "Show me total sales by customer region for last month"
Copilot genera:
SELECT
c.Region,
SUM(f.SalesAmount) AS TotalSales
FROM dbo.FactSales AS f
INNER JOIN dbo.DimCustomer AS c ON f.CustomerKey = c.CustomerKey
INNER JOIN dbo.DimDate AS d ON f.DateKey = d.DateKey
WHERE d.Date >= DATEADD(MONTH, -1, GETDATE())
GROUP BY c.Region;
🎨
17. Query con Visual query editor
La interfaz
Visual query editor = experiencia similar al Power Query online diagram view. Para usuarios que prefieren no-code drag and drop sobre escribir T-SQL.
Cómo usarlo
New visual query.
Arrastrar una tabla al canvas.
Usar el menú Transform o el botón (+) en el visual para añadir columnas, filtrar, agregar, hacer join, group by, etc.
Cuándo cada uno
Situación
Editor
T-SQL developer
SQL query editor
Analista low-code
Visual query editor
Query compleja
SQL (más control)
Exploración rápida
Visual
Reutilización cross-project
SQL (más portable)
📚
18. Views y stored procedures
Más allá de las queries ad hoc, puedes guardar la lógica de transformación como objetos reutilizables.
Views
Definen una saved query que puedes referenciar como si fuera una tabla.
Use cases: estandarizar cómo los analistas acceden a la data, combinar fact y dimension tables en formato reporting-friendly, filtrar rows a un contexto de negocio específico y ocultar la complejidad de las tablas subyacentes.
CREATE VIEW dbo.vw_SalesByRegion
AS
SELECT
c.Region,
SUM(f.SalesAmount) AS TotalSales,
COUNT(f.OrderID) AS OrderCount
FROM dbo.FactSales AS f
INNER JOIN dbo.DimCustomer AS c ON f.CustomerKey = c.CustomerKey
GROUP BY c.Region;
Se consumen así:
SELECT * FROM dbo.vw_SalesByRegion WHERE Region = 'North';
Stored procedures
Contienen lógica T-SQL que ejecutas on demand.
Use cases: tareas de transformación repetibles, cargar staging data en tablas finales, aplicar business rules y lógica ETL compleja parametrizable.
CREATE PROCEDURE dbo.usp_LoadFactSales
@LoadDate DATE
AS
BEGIN
INSERT INTO dbo.FactSales (SalesKey, CustomerKey, ProductKey, DateKey, SalesAmount, Quantity)
SELECT
s.OrderID,
c.CustomerKey,
p.ProductKey,
d.DateKey,
s.Amount,
s.Qty
FROM dbo.StgSales AS s
INNER JOIN dbo.DimCustomer AS c ON s.CustomerID = c.CustomerAltKey
INNER JOIN dbo.DimProduct AS p ON s.ProductID = p.ProductAltKey
INNER JOIN dbo.DimDate AS d ON s.OrderDate = d.DateValue
WHERE s.OrderDate = @LoadDate;
END;
🎯 Views y AI (muy importante para el examen): las views y stored procedures también hacen tu data más accesible a las AI-powered tools. Copilot y los Fabric IQ data agents pueden consultar views como si fueran tablas. Estandarizar el acceso a datos mediante views bien nombradas mejora la accuracy de las natural language queries. Cae en preguntas de "cómo mejorar la accuracy de Copilot".
🎨
19. Modelar data en el warehouse
Por qué modelar
Sin data modeling, cada consumer tiene que averiguar qué tablas se relacionan, escribir su propia aggregation logic y adivinar el significado de las columnas.
El data modeling embebe estructura, business logic y documentación directamente en el warehouse.
Los 4 pasos del modeling
Preparar la data para clarity (hide, rename, describe).
Definir relationships entre tablas.
Estandarizar el acceso con views y measures.
Publicar semantic models para reporting.
Preparar data para consumption
Las raw warehouse tables suelen contener staging tables, surrogate key columns e internal flags. Estos son para ETL processing, no para análisis: crean ruido para los consumers.
En el model view:
A) Hide internal objects: ocultar staging tables, surrogate key columns (CustomerKey) y ETL artifacts.
B) Rename columns: CustRgn → Customer Region. Nombres business-friendly.
C) Add descriptions: tablas y columnas con descripciones, para que los users las entiendan sin documentación externa.
🎯 Por qué importa para Copilot (muy examinable): Copilot en Power BI y los Fabric IQ data agents se apoyan en los nombres de tablas, nombres de columnas y descripciones para interpretar preguntas en lenguaje natural y generar SQL o DAX correctos.
❌ CustRgn sin description → pobres resultados NL.
✅ Customer Region con description "Geographic region of the customer's primary address" → mejores resultados NL.
🔗
20. Relationships: cardinality y cross-filter direction
¿Qué es una relationship?
Relationship = conexión lógica entre dos tablas que permite filtering, grouping y aggregation across esas tablas.
En star schema: conexiones entre fact tables y dimension tables a través de shared key columns. Ejemplo: CustomerKey en FactSales y DimCustomer establece el link → permite analizar sales por customer attributes (region, segment, etc.).
Cada relationship tiene 2 properties
A) Cardinality
Describe cómo se corresponden las rows de las dos tablas. En star schema es típicamente many-to-one: muchas fact rows mapean a una única dimension row.
Tipos de cardinality:
1:1 (one-to-one)
1:* (one-to-many)
*:1 (many-to-one) ⭐ típica en star
*:* (many-to-many)
B) Cross-filter direction
Determina en qué dirección se propagan los filters entre las tablas.
Single direction: la dimension filtra el fact (⭐ estándar en star schema).
Both directions: bidireccional (más flexible pero más lenta).
Por qué single direction es el estándar
✅ Filter behavior predecible.
✅ Performante.
✅ Evita ambigüedad en modelos complejos.
Both directions puede causar problemas de ambigüedad, dependencias circulares y penalizaciones de performance. Usar bidireccional solo cuando sea específicamente necesario.
Beneficio de definir relationships
Sin relationships, cada consumer que quiera combinar data across tables necesita escribir lógica JOIN explícita. Las relationships eliminan esa repetición codificando la conexión una sola vez.
Cuando creas un semantic model desde el warehouse, Power BI, Copilot y los Fabric IQ data agents usan estas relationships, y los data agents generan joins correctos al traducir natural language a SQL.
📊
21. Views y measures para consumo
La necesidad de standardization
Sin estandarización, cada equipo escribe su join logic, aplica sus propios filtros, define sus propias fórmulas → resultados contradictorios.
Views para T-SQL consumers
Ya las vimos. Encapsulan join logic, filters y column selections en una query reutilizable.
Ejemplo: una view que hace join de fact/dimension, filtra a completed orders y expone solo las columnas relevantes → punto de partida fiable para todos los T-SQL consumers.
También: las views sirven como stable data sources para reports. En vez de apuntar los reports a las base tables (que pueden cambiar), apúntalos a views con forma consistente.
Measures para DAX
Measures = expresiones DAX reutilizables que definen cálculos como total, average, ratio o count.
Se crean directamente en el model view del warehouse:
Seleccionar una tabla.
Add new measure.
Definir la expresión DAX.
Ejemplo: una measure Total Sales que suma la columna SalesAmount asegura que todos los consumers usan el mismo cálculo.
Single source of truth
Porque la definición de la measure vive con la data, se convierte en single source of truth para esa métrica. Cuando el negocio cambia cómo calcula revenue, actualizas la measure en un solo sitio: no tienes que rastrear cada report que contiene su propia fórmula.
Views vs Measures
Juntas, views y measures cubren ambos lados del consumo:
Views estandarizan cómo los T-SQL consumers acceden y consultan la data.
Measures estandarizan cómo los cálculos de negocio aparecen en reports y dashboards.
📈
22. Semantic model con Direct Lake
Cuándo crearlo
Con las tablas preparadas, las relationships definidas y las views y measures estandarizadas, el warehouse está listo para reporting downstream.
Los equipos que consultan directamente con T-SQL pueden trabajar con el warehouse model tal cual. Pero cuando quieres construir reports y dashboards interactivos de Power BI → crear un semantic model es el siguiente paso.
Direct Lake por defecto
Los semantic models creados desde un Fabric warehouse usan Direct Lake mode.
Import mode: copia la data en memoria de Power BI → requiere scheduled refreshes.
Direct Lake: lee la data directamente de los ficheros Parquet de OneLake → no requiere refreshes.
Ventajas de Direct Lake
✅ Los reports reflejan la última data del warehouse sin scheduled refreshes.
✅ Evitas el storage overhead de mantener una copia separada.
✅ Evitas el processing overhead de los refreshes.
✅ Performance similar a Import mode (lee data en memoria on-demand).
Cómo crear
Desde el warehouse: Model view → New semantic model, seleccionar tablas a incluir, confirmar relationships y measures, y listo. Los reports de Power BI conectan a este semantic model, no directamente a las tablas.
Beneficios adicionales
Governance centralizado: measures definidas una vez.
RLS y sensitivity labels en el semantic model.
Reusability: múltiples reports usan el mismo model.
Endorsement: certified/promoted.
🔐
23. Seguridad: workspace roles, item permissions
La seguridad del Fabric data warehouse opera en múltiples niveles, desde el workspace access hasta rows y columns individuales.
Workspace roles (primera capa)
La data en Fabric se organiza en workspaces. Los workspace roles son la primera capa de access control.
Admin: full control.
Member: casi todo excepto borrar el workspace.
Contributor: crear/editar items.
Viewer: solo ver.
Item permissions (granular)
Además de los workspace roles, puedes conceder item permissions para compartir warehouses individuales sin dar acceso al workspace entero.
3 permisos específicos:
A) Read: permite conectar usando el SQL analytics endpoint. Sin Read → la conexión falla.
B) ReadData: permite leer data desde cualquier tabla o view del warehouse.
C) ReadAll: permite leer los raw parquet files en OneLake.
🎯 Diferencia crítica que cae en el examen:
Permission
Qué permite
Read
Conectar al SQL endpoint (sin ver data automáticamente)
ReadData
Leer data vía SQL (queries a tables/views)
ReadAll
Leer raw Parquet files directamente en OneLake
Read por sí solo no da acceso a la data: necesitas también ReadData o ReadAll. Sin Read → la connection falla del todo. ReadAll es el más amplio → parquet files raw, saltándose la capa SQL.
Item permissions: cuándo compartir
Los item permissions son útiles cuando necesitas compartir el warehouse para consumo downstream con usuarios específicos, sin dar acceso completo al workspace, con sharing granular.
🎯
24. Granular SQL security: OLS, RLS, CLS, DDM
Para un access control más preciso, el Fabric data warehouse soporta seguridad granular usando T-SQL. Estas features restringen la visibilidad de la data sin cambiar las tablas subyacentes.
Los 4 mecanismos
A) Object-Level Security (OLS)
Controla el acceso a tablas, views o procedures específicos.
GRANT/DENY a nivel de object.
Un user puede ver TableA pero no TableB.
B) Row-Level Security (RLS)
Restringe qué rows puede ver un user.
Usa WHERE clause predicates en security policies.
Un manager solo ve las ventas de su región.
C) Column-Level Security (CLS)
Restringe qué columns son visibles para usuarios específicos.
Un user puede ver email pero no salary.
D) Dynamic Data Masking (DDM)
Enmascara data sensible (emails, account numbers, credit cards) para usuarios no privilegiados.
La data sigue ahí, solo se enmascara en la visualización.
Ejemplo: 4111-XXXX-XXXX-1234 en vez del número completo.
Enforcement
Muy importante: las security policies definidas en T-SQL se aplican independientemente de cómo se acceda a la data: SQL client (SSMS, ADS), reports de Power BI, queries de Copilot, notebooks y cualquier otra interfaz.
Por qué importa para compliance y AI
Asegurar la warehouse data importa para el cumplimiento regulatorio (GDPR, HIPAA, LGPD) y para garantizar que las AI-powered tools como Copilot y los data agents operan dentro de límites gobernados. Sin security enforcement, Copilot podría generar queries que exponen data sensible que no debería mostrarse.
Ejemplo básico de RLS
-- 1. Create security predicate function
CREATE FUNCTION security.fn_regionaccess(@region NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS access_result
WHERE @region = USER_NAME()
OR IS_ROLEMEMBER('AdminRole') = 1;
-- 2. Create security policy
CREATE SECURITY POLICY SalesRegionFilter
ADD FILTER PREDICATE security.fn_regionaccess(Region) ON dbo.FactSales
WITH (STATE = ON);
Después de esto, SELECT * FROM dbo.FactSalessolo devuelve rows de la región del user.
Ejemplo básico de DDM
-- Alter column to add masking
ALTER TABLE dbo.Customer
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
-- Ahora los emails aparecen como aXXX@XXXX.com para usuarios no privilegiados
CLS ejemplo
-- Denegar acceso a la columna Salary a un role
DENY SELECT ON dbo.Employee (Salary) TO AnalystRole;
Combinación de todos
Puedes combinar múltiples capas: OLS niega el acceso a la tabla SalaryHistory, RLS filtra rows en Employee por departamento, CLS niega la columna SSN en Employee y DDM enmascara PhoneNumber. Todo trabaja junto en T-SQL.
🔗
25. Cross-database querying (three-part naming)
Feature
Consultar across warehouses y lakehouses del mismo workspace sin copiar data.
Three-part naming
Sintaxis: database.schema.table
SELECT
w.CustomerID,
l.total_spent
FROM MyWarehouse.dbo.DimCustomer AS w
INNER JOIN MyLakehouse.dbo.customer_spending AS l
ON w.CustomerAltKey = l.customer_id;
Un solo query, dos fuentes distintas, sin copiar data.
Ventajas
⚡ No data movement.
💰 No storage duplication.
🔗 Combinar warehouse y lakehouse con naturalidad.
🎯 Data en tiempo real across sources.
Cuándo usar
Cuando el warehouse tiene dimensions curadas y el lakehouse tiene raw sales data, y quieres combinar ambos sin copiar. Muy típico en medallion architecture: bronze/silver en Lakehouse, gold en Warehouse.
⚠️ Limitaciones:mismo workspace — las cross-workspace queries no están soportadas (requiere shortcuts). Y es read-only en el remote source (el lakehouse desde el warehouse).
📊
26. Monitoring: query insights y DMVs
Monitorizar la actividad del warehouse ayuda a identificar problemas de performance, optimizar queries y entender patrones de uso.
Query insights
Query insights provee una localización central para el histórico de queries y la información accionable de performance.
Retiene data durante 30 días.
Identificar long-running queries.
Trackear cambios de performance a lo largo del tiempo.
Entender qué queries consumen más recursos.
System views para query insights
View
Función
queryinsights.exec_requests_history
Info sobre cada completed SQL request
queryinsights.long_running_queries
Queries ordenadas por execution time
queryinsights.exec_sessions_history
Info sobre completed sessions
SELECT TOP 10 *
FROM queryinsights.long_running_queries
ORDER BY total_elapsed_time_ms DESC;
Te devuelve las 10 queries más lentas.
Dynamic Management Views (DMVs)
También puedes usar DMVs para monitorizar conexiones, sesiones y requests activos en tiempo real.
SELECT
request_id,
session_id,
start_time,
total_elapsed_time
FROM sys.dm_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time DESC;
⚠️ KILL command (importante para el examen): solo el workspace Admin puede ejecutar el comando KILL para terminar sesiones long-running. Members, Contributors y Viewers pueden ver sus propios resultados pero NO las queries de otros usuarios.
Cuándo usar cada uno
Query Insights
DMVs
Data
Histórica (30 días)
Tiempo real (ahora)
Uso
Performance trends, análisis retrospectivo
Debug de queries corriendo ahora, identificar bottlenecks
Retention
30 días automático
Sin retención (snapshot)
🔄
27. Transacciones y concurrency
Full ACID
Fabric Warehouse tiene full ACID compliance:
Atomicity: las transacciones son atómicas (all-or-nothing).
Consistency: la data siempre en estado válido.
Isolation: las transacciones no interfieren.
Durability: los cambios committed persisten.
Snapshot isolation exclusively
Fabric Data Warehouse usa snapshot isolation exclusivamente. Los intentos de cambiar el isolation level vía T-SQL son ignorados.
Capabilities de transacciones
A) DDL dentro de transacciones
BEGIN TRANSACTION;
CREATE TABLE dbo.MyTable (id INT);
INSERT INTO dbo.MyTable VALUES (1);
COMMIT;
B) Cross-database transactions: soportadas dentro del mismo workspace. Incluye lecturas desde SQL analytics endpoints.
C) Parquet-based rollback: el storage está en ficheros Parquet inmutables, así que los rollbacks son rápidos — revierten a versiones anteriores de los ficheros.
D) Automatic data compaction y checkpointing: la compaction fusiona ficheros Parquet pequeños y elimina rows borradas lógicamente. El checkpointing: cada write operation añade un JSON log file al Delta transaction log, y el checkpointing resume esos logs en un único checkpoint file → lecturas de metadata más rápidas.
📌 Best practices con transacciones:
Usa las explicit transactions con criterio: siempre COMMIT o ROLLBACK.
Mantén las transacciones cortas. Evita transacciones long-running que retienen locks (especialmente si contienen DDLs).
Retry logic con delay en pipelines o apps para manejar conflictos transitorios.
Exponential backoff para evitar retry storms.
Monitoriza locks y conflicts en el warehouse.
⚠️ Warning: las transacciones long-running con DDLs pueden causar contención con SELECT statements sobre las system catalog views (como sys.tables) y provocar problemas en el Fabric portal.
⚠️
28. Trampas típicas y confusiones frecuentes
Trampa 1: "Warehouse y SQL analytics endpoint son intercambiables"
❌ Distintos. Warehouse permite CREATE TABLE + write. SQL endpoint es read-only sobre Lakehouse.
Trampa 2: "Puedo hacer INSERT en un SQL analytics endpoint"
❌ El SQL analytics endpoint es READ-ONLY. Solo el Warehouse permite writes.
Trampa 3: "Puedo crear tablas en un SQL analytics endpoint"
❌ No. Solo el Warehouse permite DDL. En el SQL endpoint solo views y stored procedures.
Trampa 4: "Fabric Warehouse enforcea foreign keys"
❌ Los constraints son NOT ENFORCED. Se guardan como metadata para el optimizer; tú eres responsable de mantener la integridad.
Trampa 5: "Zero-copy clone duplica el storage"
❌ NO duplica data. Solo metadata. Los data files se comparten con el source.
Trampa 6: "Los clones NO copian las security policies"
❌ SÍ COPIAN RLS, CLS y DDM. No hay que re-aplicarlas.
Trampa 7: "Time travel funciona con DELETE/INSERT/UPDATE"
❌ Read-only. FOR TIMESTAMP AS OF solo funciona con SELECT.
Trampa 8: "Con time travel puedo ir 1 año atrás"
❌ Solo dentro del retention period (default 30 días, máximo 120).
Trampa 9: "El retention default es 7 días"
❌ El default es 30 días. Configurable de 1 a 120.
Trampa 10: "El permiso Read da acceso a la data"
❌ Read solo permite conectar al SQL endpoint. Para ver data necesitas ReadData o ReadAll.
Trampa 11: "ReadAll da acceso solo a algunos parquet files"
❌ ReadAll da acceso a TODOS los raw Parquet files en OneLake. Es el permiso más amplio.
Trampa 12: "RLS, CLS y DDM son mutuamente excluyentes"
❌ Se pueden combinar libremente. Son capas complementarias.
Trampa 13: "Todos los data types de SQL Server están soportados"
❌ Faltan varios: NTEXT, TEXT, IMAGE, XML, GEOGRAPHY, GEOMETRY, HIERARCHYID, MONEY, SMALLMONEY, SQL_VARIANT.
Trampa 14: "Copiar tablas es igual que clonar"
❌ Copiar duplica data (más storage, más tiempo). Clonar solo copia metadata (near-instant, storage mínimo).
Trampa 15: "El semantic model desde Warehouse usa Import mode por defecto"
❌ Direct Lake por defecto. Lee data directamente de OneLake sin copiar.
Trampa 16: "Snowflake schema es mejor para performance"
❌ Star schema es más rápido (menos joins). Snowflake reduce storage pero añade joins.
Trampa 17: "Copilot funciona igual sin descriptions"
❌ Las descriptions mejoran significativamente la accuracy de Copilot y Fabric IQ. Muy importante para AI.
Trampa 18: "Puedo cambiar el isolation level en Fabric Warehouse"
❌ Snapshot isolation exclusivamente. Los intentos de cambiarlo se ignoran.
Trampa 19: "Las cross-database queries funcionan cross-workspace"
❌ Solo dentro del mismo workspace. Cross-workspace requiere shortcuts.
Trampa 20: "Cualquiera puede hacer KILL de queries"
❌ Solo el workspace Admin. Otros roles pueden ver sus propias queries pero no las de otros.