Wicked Smart Data
LearnInsightsAboutContact
Sign InLet's Build
LearnInsightsAboutContact
Sign InLet's Build
Wicked Smart Data

Intelligence, automation, and expert execution — plus an elite library of free knowledge. We turn complexity into competitive advantage.

Start a conversation

Platform

  • Learning Paths
  • Insights
  • RSS Feed

Company

  • About
  • Contact
  • Work With Us

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Wicked Smart Data. All rights reserved.

Intelligence · Automation · Advantage

All Insights
Power BI

Implementing Power BI Dataset Sharing and Cross-Workspace Live Connections to Build a Reusable Enterprise Semantic Layer

Learn how to architect and implement a genuine enterprise semantic layer in Power BI — covering cross-workspace live connections, RLS inheritance, composite models, deployment pipelines, and XMLA-based governance. This is the lesson most Power BI tutorials skip: not just how to click the buttons, but how to make the structural decisions that determine whether your semantic layer succeeds or collapses under real-world conditions.

🔥 Expert30 min readJul 28, 2026Updated Aug 29, 2026
Implementing Power BI Dataset Sharing and Cross-Workspace Live Connections to Build a Reusable Enterprise Semantic Layer
On this page
  • Introduction
  • Prerequisites
  • Understanding the Architecture Before You Build It
  • What Happens Under the Hood
  • The Three-Tier Workspace Model
  • Building the Semantic Layer Dataset
  • Designing for Reusability
  • Building for RLS from Day One
  • Publishing and Configuring the Semantic Layer Workspace
  • Workspace Configuration
  • Configuring Dataset Settings
  • Endorsement: Making Your Dataset Discoverable
  • Connecting Reports to the Shared Dataset
  • From Power BI Desktop
  • From Power BI Service: Create Reports on Datasets
  • Managing the Cross-Workspace Reference
  • Composite Models: When Live Connection Isn't Enough
  • Understanding Composite Model Architecture
  • Relationships Across the Composite Boundary
  • RLS in Composite Models
  • Deployment Pipelines and Dataset Lifecycle Management
  • Setting Up a Pipeline for the Semantic Layer
  • The Critical Insight About Live Connections and Pipelines
  • XMLA Endpoint: The Power User's Tool
  • Performance Optimization for a High-Traffic Semantic Layer
  • Monitoring Query Performance
  • Aggregations: The Performance Multiplier
  • Import vs. DirectQuery: The Architecture Decision
  • Hands-On Exercise
  • Setup
  • Step 1: Build the Semantic Layer Dataset
  • Step 2: Publish and Configure
  • Step 3: Connect from a Separate Workspace
  • Step 4: Verify the Live Connection
  • Common Mistakes & Troubleshooting
  • "Dataset not found" after workspace move
  • RLS not applying to composite model local tables
  • Report authors building local copies instead of using the shared dataset
  • Performance degradation under concurrent load
  • Composite model relationship issues
  • Scheduled refresh failing for shared dataset
  • Summary & Next Steps
  • Implementing Power BI Dataset Sharing and Cross-Workspace Live Connections to Build a Reusable Enterprise Semantic Layer

    Introduction

    Picture this: your organization has seventeen Power BI workspaces. The Finance team built a beautiful revenue model with carefully curated DAX measures, a properly modeled date table, and clean relationships between sales orders, customers, and products. Then the Sales team built a report that needs the same revenue figures, so they exported the data to Excel, imported it into their own workspace, and wrote the same measures from scratch — slightly differently. Now the CFO is asking why the quarterly revenue number in the Finance dashboard is $2.3 million different from the number in the Sales performance report, and everyone in the meeting is looking at their phones trying to avoid eye contact.

    This is the semantic layer problem. It's not a technology problem — it's an organizational and architectural problem that technology can solve, but only if you implement it deliberately. Power BI's dataset sharing and cross-workspace live connection features are Microsoft's answer to this challenge. When implemented correctly, they let you build a single, governed, trusted semantic layer that dozens of reports across the organization consume, while still giving report authors the flexibility to build whatever visualizations they need. When implemented incorrectly, you get a distributed mess that's harder to maintain than what you started with.

    By the end of this lesson, you'll understand how to architect and implement a genuine enterprise semantic layer in Power BI — not just how to click the right buttons, but how to make the structural and governance decisions that determine whether it succeeds or fails two years from now.

    What you'll learn:

    • How Power BI's shared dataset architecture works internally, including the Analysis Services engine layer and what that means for performance and security
    • How to design a workspace topology that separates semantic layer ownership from report authoring
    • How to configure and use cross-workspace live connections from both Power BI Desktop and Power BI Service
    • How to manage permissions, endorsement, and discoverability so report authors actually find and use the right datasets
    • How to handle the real-world complications: composite models, row-level security inheritance, incremental refresh, and deployment pipeline integration

    Prerequisites

    This lesson assumes you're comfortable building Power BI data models, writing non-trivial DAX, and working in the Power BI Service. You should have hands-on experience with workspaces, reports, and datasets. You'll need either a Power BI Premium capacity (Per User or Per Workspace) or Power BI Pro licenses for sharing across workspaces. Some sections reference Tabular Model Scripting Language (TMSL) and the XMLA endpoint — familiarity with these is helpful but not required, since we'll explain the relevant concepts as we go.


    Understanding the Architecture Before You Build It

    Before touching Power BI Desktop, you need to understand what you're actually building. The term "semantic layer" gets thrown around loosely, so let's define it precisely in this context.

    A Power BI semantic layer is a Power BI dataset that:

    1. Contains no report visualizations — it's a pure data model
    2. Is published to a dedicated workspace with appropriate governance
    3. Expresses business logic through DAX measures, calculated columns, and relationship semantics
    4. Is intended to be consumed by multiple reports across multiple workspaces via live connections

    When you publish a Power BI Desktop file to the service, Power BI separates the dataset from the report — they become independent artifacts in the workspace. You can already see the foundation of this architecture in how Power BI works natively. What we're doing is making this intentional and structured.

    What Happens Under the Hood

    Power BI datasets run on a hosted instance of Analysis Services (specifically, the Tabular model at compatibility level 1500 or higher). When a report connects to a dataset via live connection, it's making a DAX query against this Analysis Services engine. The query execution happens in the dataset's workspace capacity, not in the report's workspace — this has significant implications for capacity planning that most tutorials skip over.

    When you establish a cross-workspace live connection, the following chain occurs:

    1. The report workspace holds only report metadata (visuals, pages, interactions) — essentially a thin JSON description
    2. When a user opens the report, Power BI resolves the dataset reference to the remote workspace
    3. Every visual generates a DAX query that travels to the dataset's capacity for execution
    4. Results come back to the client for rendering

    This means your semantic layer workspace needs to be on a capacity sized for query load, not just for the size of the data. We'll come back to capacity planning in the performance section.

    The Three-Tier Workspace Model

    The most robust enterprise architecture separates concerns into three tiers:

    Tier 1 — Data Engineering Workspace: This is where raw data arrives from pipelines. Dataflows, staging datasets, and transformation logic live here. Only data engineers have Edit access. Other workspaces consume outputs from here, not the raw sources directly.

    Tier 2 — Semantic Layer Workspace: This is where certified, governed datasets live. These datasets import from Tier 1 dataflows or connect via DirectQuery to data sources. They contain the authoritative business logic. A small, senior group owns this workspace. This is what report authors connect to.

    Tier 3 — Report Workspaces: Organized by business domain, team, or function. Report authors have Edit access here. They connect to Tier 2 datasets via live connections and build their reports. They cannot modify the underlying data model.

    This three-tier model isn't just organizational tidiness — it creates clear accountability. When a measure is wrong, everyone knows who owns the fix. When a data source changes, only Tier 2 needs updating and all downstream reports benefit automatically.


    Building the Semantic Layer Dataset

    Let's work through a realistic scenario. We're building a semantic layer for a retail company with data across sales transactions, customers, products, stores, and a calendar. This will be consumed by at least five report workspaces: Finance, Sales Operations, Marketing, Store Operations, and Executive.

    Designing for Reusability

    The single biggest mistake when building a shared dataset is designing it for one report's needs. You end up with a model that has a weird granularity, measures named for one team's terminology, and a filter context optimized for one team's slicers.

    Design principles for a reusable semantic layer:

    Keep the grain flexible. Your fact tables should be at the lowest grain available. If Sales has daily transaction-level data, store it at that grain. Teams that need monthly aggregates can achieve that through DAX measures or report-level filters. Never pre-aggregate at the model level unless you have a strong performance reason and you understand the reporting limitations this creates.

    Use universal business terminology. Measures should be named with terms the entire organization understands. "Net Revenue" is better than "Revenue After Returns and Discounts (Finance Calc)." You can add descriptions in the measure metadata to explain methodology.

    Build a complete date table. Every enterprise semantic layer needs a proper date table. Don't let each report team build their own. Here's a DAX pattern for a robust date table:

    Date = 
    VAR _StartDate = DATE(2018, 1, 1)
    VAR _EndDate = DATE(2030, 12, 31)
    RETURN
    ADDCOLUMNS(
        CALENDAR(_StartDate, _EndDate),
        "Year", YEAR([Date]),
        "Year-Month", FORMAT([Date], "YYYY-MM"),
        "Month Number", MONTH([Date]),
        "Month Name", FORMAT([Date], "MMMM"),
        "Month Name Short", FORMAT([Date], "MMM"),
        "Quarter", "Q" & QUARTER([Date]),
        "Quarter Number", QUARTER([Date]),
        "Day of Week", WEEKDAY([Date], 2),
        "Day Name", FORMAT([Date], "dddd"),
        "Is Weekday", IF(WEEKDAY([Date], 2) <= 5, TRUE, FALSE),
        "Is Weekend", IF(WEEKDAY([Date], 2) > 5, TRUE, FALSE),
        "Fiscal Year", 
            IF(MONTH([Date]) >= 7, 
               "FY" & YEAR([Date]) + 1, 
               "FY" & YEAR([Date])),
        "Fiscal Quarter",
            SWITCH(TRUE(),
                MONTH([Date]) IN {7, 8, 9}, "FQ1",
                MONTH([Date]) IN {10, 11, 12}, "FQ2",
                MONTH([Date]) IN {1, 2, 3}, "FQ3",
                MONTH([Date]) IN {4, 5, 6}, "FQ4"
            ),
        "Fiscal Period Sort", 
            IF(MONTH([Date]) >= 7, 
               (YEAR([Date]) + 1) * 100 + (MONTH([Date]) - 6),
               YEAR([Date]) * 100 + (MONTH([Date]) + 6))
    )
    

    Notice the fiscal year logic assumes a July 1 fiscal year start — document this assumption clearly in your dataset description. Different organizations have different fiscal calendars, and the semantic layer needs to reflect yours precisely.

    Implement a robust measure naming and folder structure. Group measures into display folders so the field list is navigable when report authors are looking at a model with 80+ measures:

    -- Folder: Revenue Metrics
    Net Revenue = 
        SUMX(
            Sales,
            Sales[Quantity] * Sales[Unit Price] * (1 - Sales[Discount Rate])
        )
    
    -- Folder: Revenue Metrics
    Revenue vs Prior Year = 
        VAR _CurrentRevenue = [Net Revenue]
        VAR _PYRevenue = CALCULATE([Net Revenue], SAMEPERIODLASTYEAR('Date'[Date]))
        RETURN
            DIVIDE(_CurrentRevenue - _PYRevenue, _PYRevenue, BLANK())
    
    -- Folder: Revenue Metrics\Budget Variance
    Revenue vs Budget = 
        VAR _ActualRevenue = [Net Revenue]
        VAR _BudgetRevenue = [Budgeted Revenue]
        RETURN
            _ActualRevenue - _BudgetRevenue
    

    In Power BI Desktop, you set the Display Folder property in the measure's properties pane. Organize by logical function, not by source table — report authors think in business terms, not database terms.

    Building for RLS from Day One

    Row-level security in a shared dataset is significantly more complex than in a single-report dataset, because you're designing security for users across multiple workspaces who may have very different data access requirements.

    The standard approach is to build dynamic RLS that uses the signed-in user's identity to determine their data access. Here's a pattern using a user-mapping table:

    -- RLS Filter on the Sales table:
    [Store Region] IN 
        CALCULATETABLE(
            VALUES(UserRegionAccess[Region]),
            UserRegionAccess[UserEmail] = USERPRINCIPALNAME()
        )
    

    The UserRegionAccess table is a mapping table that stores email addresses and their permitted regions. This table can be loaded from a SQL table that your IT security team maintains, which means access changes flow through without requiring a dataset republish.

    Warning

    The user identity passed through a live connection is the actual end user's identity (via Azure AD), not a service account. This is correct for RLS purposes. However, it means you cannot test RLS easily during development unless you use the "View As" feature or have test accounts for each role. Plan your testing strategy before you roll out to consumers.

    The Inheritance Problem: When a report author creates a report on your shared dataset, RLS applies based on the report viewer's identity, not the report author's. This is the correct behavior — but report authors are often surprised when they see different data than their report viewers. Document this clearly in your dataset description.

    There's one important RLS scenario that catches teams off guard: what happens when a report author wants to embed their own data alongside the semantic layer data? We'll cover composite models later, but understand from the start that RLS isolation becomes more complex in composite scenarios.


    Publishing and Configuring the Semantic Layer Workspace

    With your dataset designed, you need to publish it to the right place and configure it correctly for enterprise use.

    Workspace Configuration

    Navigate to the Power BI Service and create your semantic layer workspace. The workspace name matters — it shows up in connection dialogs and dataset discovery. Use a clear naming convention like [OrgName] - Enterprise Data Models or [Domain] - Semantic Layer. Avoid names like "Analytics Workspace" that don't communicate purpose.

    Workspace settings to configure:

    License mode: For cross-workspace live connections from Pro users to work, the semantic layer workspace needs to be on Premium capacity (either dedicated or Premium Per User). Without this, users in other workspaces cannot connect to datasets in this workspace. This is a hard requirement, not an optimization.

    Workspace access: Grant access levels deliberately:

    • Data Engineering team: Member (can publish datasets, but not manage workspace settings)
    • Dataset owners: Admin (can manage all content and settings)
    • Report workspace owners: Viewer (can see what's in the workspace to discover datasets)
    • Do NOT give broad Edit access — this workspace should have controlled write access

    After publishing your .pbix file, you'll see both a report and a dataset in the workspace. Delete or archive the auto-generated report — this workspace is for datasets only. Having reports here confuses the governance model.

    Configuring Dataset Settings

    Open the dataset settings by clicking the three-dot menu next to the dataset, then "Settings." Several configurations are critical:

    Gateway connections: If your dataset uses DirectQuery to on-premises sources, or imports from on-premises data via a gateway, configure the gateway connection here. The gateway used here applies to all consumers of this dataset — they don't need to manage their own gateway connections.

    Scheduled refresh: Configure refresh timing here. For an enterprise semantic layer that many reports depend on, consider staggering refresh timing and setting up refresh failure notifications. A failed refresh at 6 AM that no one notices means every executive dashboard showing stale data during the morning standup.

    Query scale-out (Premium only): In the dataset settings, you'll see a "Query scale-out" option for Premium workspaces. Enabling this allows read replicas to serve query traffic while the primary replica handles refresh. For a high-traffic semantic layer, this is essential — without it, a refresh operation can block queries for the entire duration of the refresh.

    Large dataset storage format: For datasets over a few hundred million rows, enable the large dataset storage format. This uses a different on-disk format that improves refresh performance and allows datasets to exceed the standard 1 GB or 10 GB size limits. Navigate to Settings > Dataset > Large dataset storage format and enable it.

    Endorsement: Making Your Dataset Discoverable

    Endorsement is the mechanism by which you signal to report authors that a dataset is trustworthy. There are two levels:

    Promoted: Signals that the dataset is ready for broad consumption. Workspace admins can promote their own datasets. Use this for stable, tested datasets that teams should use.

    Certified: The highest trust level. Only tenant-level admins can certify datasets (or users they delegate to). Certified datasets appear with a distinctive badge in the data hub and are surfaced prominently in connection dialogs. Use this sparingly — only for the canonical, governed enterprise datasets.

    To promote a dataset: in the workspace, click the three-dot menu on the dataset, then "Endorse" > "Promote." To certify, you need access to the admin portal's endorsement settings.

    From the Power BI admin portal (under Tenant settings > Endorsement and discovery), configure who can certify datasets. In most enterprises, this should be a small governance committee — not just any workspace admin.

    Tip

    Enable the "Data Hub" feature in your tenant settings. The Data Hub (accessible from the left nav in Power BI Service) shows all promoted and certified datasets across the tenant, making discovery much easier for report authors. Without good discovery, teams bypass the semantic layer and build their own models — defeating the entire purpose.


    Connecting Reports to the Shared Dataset

    Now comes the part that report authors will actually use day-to-day. There are two connection paths: from Power BI Desktop and from the Power BI Service directly.

    From Power BI Desktop

    Open Power BI Desktop and instead of using "Get Data" to connect to a database, use Home > Get Data > Power BI datasets. This opens a dialog showing available datasets.

    The dialog shows datasets from workspaces you have access to. If you've properly configured endorsement, certified and promoted datasets appear at the top with their badges. Select your enterprise semantic layer dataset and click Connect.

    This creates a live connection — Power BI Desktop shows "Live connection" in the status bar. You'll notice that:

    • You cannot add new tables to the model
    • You cannot modify existing tables, columns, or relationships
    • You can see all measures, tables, and hierarchies from the source dataset
    • You can build visuals exactly as you would with a local dataset

    Report authors sometimes push back on the inability to add local data. This is where you explain the governance trade-off: the restriction is the feature. If every report author could modify the model, the semantic layer ceases to be an authoritative source.

    What report authors CAN do in Desktop with a live connection:

    They can add report-level measures. In the Model view (which is read-only for live connections), under the "External tools" ribbon or in the Fields pane, report authors can create new measures that will only exist in their report, not in the shared dataset. This is powerful — a report author can build a highly specific metric without polluting the semantic layer:

    -- This measure lives in the report, not the semantic layer
    Top 10 Stores Revenue = 
        CALCULATE(
            [Net Revenue],
            TOPN(10, ALL(Store[Store Name]), [Net Revenue], DESC)
        )
    

    Warning

    Report-level measures in a live connection report cannot reference other report-level measures. They can only reference measures from the source dataset. This limitation frustrates advanced report authors who are used to building chains of DAX measures — document it clearly in your adoption guide.

    From Power BI Service: Create Reports on Datasets

    From the Power BI Service, you can create a new report directly on a shared dataset without ever touching Power BI Desktop. Navigate to the Data Hub, find your certified semantic layer dataset, and click "Create report."

    This opens the web report editor with a live connection to the dataset. Everything in the Fields pane comes from the semantic layer. The report is saved in whatever workspace the user selects — typically their own domain workspace.

    This workflow is excellent for rapid prototyping and for business users who don't use Power BI Desktop. The limitation is that the web editor has fewer features than Desktop (no custom visuals from the marketplace, limited formatting options for some visual types).

    Managing the Cross-Workspace Reference

    When a report in Workspace B connects to a dataset in Workspace A, Power BI stores this as a cross-workspace reference in the report's metadata. This reference is stable — it doesn't break if you move the report to a different workspace, as long as the dataset stays in its original location.

    If you move or rename the dataset workspace, all live connection reports lose their connection. This is one reason your semantic layer workspace naming and location should be treated as permanent infrastructure decisions, not easily changed later.

    You can view and manage dataset connections in the Power BI Service by navigating to the report settings and looking at the "Data source credentials" section, which will show the dataset being used.


    Composite Models: When Live Connection Isn't Enough

    Pure live connections give report authors zero access to add their own data. For most use cases in an enterprise semantic layer scenario, this is correct. But there are legitimate cases where a report author needs to combine the semantic layer with their own local data. Composite models address this.

    Understanding Composite Model Architecture

    With composite models enabled, a report author can start with a live connection to the shared dataset and then add additional data sources. Power BI builds what's called a composite model — part of the data comes from the remote Analysis Services dataset, part comes from locally imported tables or other DirectQuery sources.

    To enable this: in Power BI Desktop with an active live connection, click "Make changes to this model" in the yellow banner (or via the Model ribbon). Power BI will warn you that this converts to a composite model. After confirming, you can use "Get Data" to add new tables.

    Here's the critical architectural implication: when you add local tables to a composite model, the storage for those local tables lives in the report's workspace dataset — not in the semantic layer workspace. You've created a new, derived dataset. If the semantic layer dataset is updated (new measures, schema changes), your composite model does inherit those changes through the live connection side. But your local tables are your responsibility to refresh.

    Relationships Across the Composite Boundary

    Adding a local data source to a composite model means you need to create relationships between your local tables and the remote semantic layer tables. Power BI allows this, but the relationship semantics have constraints:

    • Relationships from a local table to the remote dataset can be defined, but Power BI will create limited relationships (typically one-directional)
    • Filters flow from the remote dataset to local tables by default
    • Bidirectional cross-filter relationships across the composite boundary are generally not available

    A realistic scenario: a Sales Operations manager wants to combine the enterprise Net Revenue measure with their own territory quota data, which lives in a spreadsheet. They add the quota spreadsheet as a local table and create a relationship from the territory column in their local table to the territory dimension in the semantic layer. Now they can build a visual showing Net Revenue vs Quota by territory.

    -- Report-level measure in the composite model
    Revenue to Quota Ratio = 
        DIVIDE([Net Revenue], SUM(LocalQuota[QuotaAmount]), BLANK())
    

    This works — but the report author now owns two responsibilities: keeping the spreadsheet updated and maintaining the relationship logic. Neither of these is the semantic layer team's concern.

    RLS in Composite Models

    RLS in composite models follows complex inheritance rules. For the semantic layer side of the composite model, RLS from the source dataset is enforced — the report viewer only sees data they're permitted to see in the semantic layer. For local tables, RLS must be defined separately at the composite model level.

    This creates a potential security gap: if a local table contains sensitive data, and the report author doesn't define RLS on it, all viewers of the report see all rows in that table — even if they'd be restricted in the semantic layer. Audit composite models for this vulnerability, especially when they're shared broadly.


    Deployment Pipelines and Dataset Lifecycle Management

    An enterprise semantic layer isn't a one-time build — it evolves as the business changes. Deployment pipelines let you manage this evolution in a controlled way.

    Setting Up a Pipeline for the Semantic Layer

    Create a three-stage deployment pipeline in the Power BI Service: Development, Test, and Production. Assign your workspaces appropriately:

    • Development workspace: The semantic layer team works here, makes schema changes, adds new measures, tests new data sources
    • Test workspace: A stable copy of the dataset that stakeholders can test against before production deployment; report QA happens here
    • Production workspace: The certified, certified dataset that all production reports connect to

    To create the pipeline: from the Power BI Service left navigation, select "Deployment Pipelines" > "New Pipeline." Name it something like "Enterprise Semantic Layer Pipeline" and then assign workspaces to each stage.

    The Critical Insight About Live Connections and Pipelines

    Here's something that trips up many teams: when you deploy the dataset from one pipeline stage to the next, reports that are live-connected to the Production dataset are not affected until the deployment happens. But when you deploy, the dataset in the Production workspace is replaced — and all live-connected reports immediately start querying the new dataset.

    This means schema changes (removing or renaming tables/columns/measures) are breaking changes for downstream reports. If you remove a measure called Legacy Gross Margin from the semantic layer and deploy to Production, every report using that measure breaks simultaneously.

    Best practices for managing breaking changes:

    1. Never remove measures — deprecate them by adding "DEPRECATED" to the description and replacing the DAX with a BLANK() return and a warning message in the description
    2. Use the XMLA endpoint to audit measure usage across connected reports before removing anything
    3. Maintain a changelog in the dataset description and communicate changes to report authors at least two weeks in advance
    4. Use deployment pipeline parameters to manage environment-specific connection strings

    XMLA Endpoint: The Power User's Tool

    The XMLA endpoint exposes your Power BI Premium dataset as a standard Analysis Services endpoint. This unlocks a range of enterprise tooling:

    Querying dataset metadata: You can connect SQL Server Management Studio (SSMS) or Azure Data Studio to the XMLA endpoint and browse the model structure, including measure dependencies and usage patterns.

    Scripting with TMSL: You can export the dataset definition as TMSL JSON, version-control it in Git, and deploy changes programmatically. This is the enterprise change management approach:

    {
      "createOrReplace": {
        "object": {
          "database": "Enterprise Semantic Layer",
          "table": "Revenue Metrics",
          "measure": "Net Revenue"
        },
        "measure": {
          "name": "Net Revenue",
          "expression": "SUMX(Sales, Sales[Quantity] * Sales[Unit Price] * (1 - Sales[Discount Rate]))",
          "displayFolder": "Revenue Metrics",
          "description": "Net revenue after applying discount rates. Based on transaction-level sales data."
        }
      }
    }
    

    Tabular Editor integration: The open-source tool Tabular Editor (or Tabular Editor 3, the commercial version) connects to your dataset via XMLA and lets you edit measures, calculated tables, roles, and model metadata in a much more efficient interface than Power BI Desktop. Best practice scripted metric (BPA) rules in Tabular Editor can enforce naming conventions, detect unused measures, and flag performance anti-patterns across your entire semantic layer — this is essential governance tooling for a production enterprise layer.


    Performance Optimization for a High-Traffic Semantic Layer

    A semantic layer serving dozens of reports under concurrent user load has very different performance requirements than a single-report dataset.

    Monitoring Query Performance

    From the Power BI Service, access Performance Analyzer by opening a report and using the Performance Analyzer pane (under View). But for a semantic layer, you need aggregate visibility — individual report performance analyzers only show you one report at a time.

    Use the XMLA endpoint with SSMS to execute Dynamic Management View (DMV) queries against your dataset. The $SYSTEM.DISCOVER_SESSIONS and $SYSTEM.DISCOVER_COMMANDS DMVs show active queries and their execution times. For historical analysis, Power BI Premium includes execution logs that you can access via the Admin API and pipe into a Log Analytics workspace in Azure Monitor.

    Aggregations: The Performance Multiplier

    For large fact tables (hundreds of millions of rows), aggregations are the most impactful optimization. Aggregations are pre-computed summary tables that Power BI uses to satisfy common queries without scanning the detail table.

    To add an aggregation: in Power BI Desktop, add a summary table to your model (e.g., a monthly-grain sales summary), then in the Manage Aggregations dialog (right-click the summary table in the Fields pane), map each column to its aggregate function over the detail table.

    When Power BI generates a DAX query that can be satisfied by the aggregation (e.g., total Net Revenue by Month and Region), it hits the aggregation table instead of scanning millions of rows. For a semantic layer with heavy concurrent usage, this can reduce query times from 30 seconds to under 1 second for common summary queries.

    Tip

    Design your aggregation tables based on actual query patterns, not what you assume users will query. Enable query logging for two weeks, analyze the DAX queries generated, and build aggregations targeting the most frequent patterns. Aggregations you guess at are often wrong; aggregations based on data are always useful.

    Import vs. DirectQuery: The Architecture Decision

    For a semantic layer, import mode generally delivers the best query performance because all data is in-memory. DirectQuery works for near-real-time scenarios but introduces latency and places load on source systems with every query.

    A hybrid approach using DirectQuery with dual storage mode aggregations can work well: the aggregation table uses import mode (refreshed frequently), and the detail table uses DirectQuery. Power BI satisfies summary queries from the in-memory aggregation and only hits DirectQuery for drill-downs to detail — the least frequent query pattern.


    Hands-On Exercise

    This exercise builds a minimal enterprise semantic layer for a retail scenario and connects a report from a separate workspace to it.

    Setup

    You need two Power BI workspaces: "Retail Semantic Layer" (Tier 2 workspace) and "Store Operations Reports" (Tier 3 workspace). The Retail Semantic Layer workspace should be on a Premium Per User capacity to enable cross-workspace connections.

    Step 1: Build the Semantic Layer Dataset

    Open Power BI Desktop. Create the following tables using the Enter Data feature (for this exercise — in production, you'd connect to actual sources):

    Sales table with columns: SalesID, OrderDate, CustomerID, ProductID, StoreID, Quantity, UnitPrice, DiscountRate

    Store table with columns: StoreID, StoreName, StoreRegion, StoreTier (A/B/C)

    Date table using the DAX expression from earlier in this lesson.

    Mark the Date table as a Date Table (Table Tools > Mark as date table, using the Date column). Create relationships: Sales[OrderDate] to Date[Date], Sales[StoreID] to Store[StoreID].

    Create these measures:

    Net Revenue = 
        SUMX(
            Sales,
            Sales[Quantity] * Sales[UnitPrice] * (1 - Sales[DiscountRate])
        )
    
    Transaction Count = COUNTROWS(Sales)
    
    Average Order Value = 
        DIVIDE([Net Revenue], [Transaction Count], BLANK())
    
    Net Revenue YTD = 
        TOTALYTD([Net Revenue], 'Date'[Date])
    
    Revenue Growth YoY = 
        VAR _Current = [Net Revenue]
        VAR _PY = CALCULATE([Net Revenue], SAMEPERIODLASTYEAR('Date'[Date]))
        RETURN 
            DIVIDE(_Current - _PY, _PY, BLANK())
    

    Set display folders: put all five measures in a folder called "Revenue Metrics."

    Create an RLS role called "Region Managers" with this filter on the Store table:

    [StoreRegion] = USERPRINCIPALNAME()
    

    (This is a simplified test RLS — in production you'd use a mapping table as described earlier.)

    Step 2: Publish and Configure

    Save the file as RetailSemanticLayer.pbix and publish to the "Retail Semantic Layer" workspace. After publishing, delete the auto-generated report from the workspace.

    In the workspace, open dataset settings. Configure a scheduled refresh (set to daily, choose a time). Under Endorsement, promote the dataset. If you have tenant admin rights, certify it.

    Open the dataset description (three-dot menu > Settings > Description) and add: "Certified enterprise retail data model. Contains revenue metrics, store dimensions, and date intelligence. For questions, contact the Data Governance team. Last schema change: [today's date]."

    Step 3: Connect from a Separate Workspace

    Open a new Power BI Desktop instance. Go to Home > Get Data > Power BI datasets. Find your "RetailSemanticLayer" dataset (it should appear with the Promoted badge). Connect.

    You now have a live connection. Build a report page with:

    • A card visual showing Net Revenue
    • A bar chart showing Net Revenue by StoreRegion
    • A line chart showing Net Revenue YTD over time (use Date[Year-Month] on the axis)
    • A slicer on Store[StoreTier]

    Add a report-level measure:

    Top Region Revenue Share = 
        VAR _TopRegionRevenue = 
            MAXX(
                ALLSELECTED(Store[StoreRegion]),
                CALCULATE([Net Revenue])
            )
        RETURN 
            DIVIDE(_TopRegionRevenue, CALCULATE([Net Revenue], ALL(Store[StoreRegion])), BLANK())
    

    Notice this measure appears in the Fields pane with a different icon than dataset measures, indicating it's report-local.

    Publish this report to the "Store Operations Reports" workspace. Verify in the Service that the dataset reference shows "RetailSemanticLayer" from the other workspace.

    Step 4: Verify the Live Connection

    Make a change to the semantic layer. In your original RetailSemanticLayer.pbix, rename the Average Order Value measure to Avg Transaction Value and republish. Go back to the Store Operations report in the Service. If any visuals used the old measure name, they'll show errors — demonstrating exactly why breaking changes need a deprecation process.


    Common Mistakes & Troubleshooting

    "Dataset not found" after workspace move

    If you move the semantic layer workspace to a different Premium capacity or rename it, cross-workspace live connections will break. The connection stores a workspace ID, not a name — but moving to a different capacity can invalidate the connection. Always test connections after any infrastructure changes.

    RLS not applying to composite model local tables

    This is a silent security issue. After converting a live connection to a composite model and adding local tables, run a test with a restricted user account to verify that local table data is appropriately restricted. If it's not, define RLS roles in the composite model that filter local tables.

    Report authors building local copies instead of using the shared dataset

    This is a governance failure, not a technical one. Symptoms: duplicate metrics with different values across the organization, report authors complaining that the semantic layer is "missing" things they need. Root causes are usually: insufficient measures in the semantic layer (forcing report authors to build their own), poor discoverability (they can't find the shared dataset), or a process too slow for adding new measures to the semantic layer. Address root causes by investing in the data catalog/Data Hub, creating a fast-track process for adding measures, and building report author documentation.

    Performance degradation under concurrent load

    If query times increase significantly when many users open reports simultaneously, you're likely hitting capacity limits. Diagnose using the Premium Capacity Metrics app (install from AppSource). Look for high CPU utilization and query wait times. Solutions: enable Query Scale-Out to serve read replicas, add aggregations to deflect heavy queries, or increase Premium capacity size.

    Composite model relationship issues

    If you're adding local tables to a composite model and getting incorrect results (wrong totals, unexpected BLANK values), the most common cause is a many-to-many relationship across the composite boundary. Composite models handle M2M relationships differently than pure import models. Diagnose by checking the "Cardinality" setting on cross-boundary relationships and testing with simple queries before building complex measures.

    Scheduled refresh failing for shared dataset

    A failed refresh shows a warning icon on the dataset in the workspace. Check the refresh history (dataset Settings > Refresh history) for the specific error. Common causes: gateway credential expiration (update the credential in the gateway), source database connectivity issues (firewall rules changed), or a data type change in the source that breaks a query. For enterprise workloads, configure refresh failure email notifications so someone is alerted immediately rather than discovering the issue when users report stale data.


    Summary & Next Steps

    You've now worked through the full architecture and implementation of a Power BI enterprise semantic layer. Let's consolidate what actually matters:

    The semantic layer pattern's value is entirely about governance: one place where business logic lives, one team responsible for its accuracy, one update that propagates to all downstream reports. If you build the architecture but don't enforce the governance — if you let report teams keep building their own models — you've created infrastructure with no actual benefit.

    The technical implementation involves four layers working together: the dataset design (import mode, proper relationships, comprehensive measures, dynamic RLS), the workspace topology (separation of Tier 2 semantic layer from Tier 3 report workspaces), the deployment lifecycle (deployment pipelines, XMLA-based change management, deprecation practices), and performance infrastructure (aggregations, query scale-out, monitoring).

    Composite models are an escape hatch, not a recommended pattern. They're appropriate for specific team-level data augmentation use cases, but a proliferation of composite models signals that the semantic layer isn't meeting teams' needs — which is a governance conversation, not a technical one.

    Recommended next steps:

    1. Audit your current environment. Before building, count how many models currently contain duplicated business logic. The number will motivate the investment in building it right.

    2. Start small and prove value. Pick one high-visibility metric — executive-facing revenue, for instance — and build the semantic layer for that domain first. Migrate the most authoritative existing report to use it. Show the business the value before expanding.

    3. Learn Tabular Editor. For any team seriously managing an enterprise semantic layer, Tabular Editor (or Tabular Editor 3) changes the productivity equation for model development dramatically. The Best Practice Analyzer rules alone will catch more model quality issues than manual review.

    4. Implement the Admin monitoring pipeline. The Power BI Admin REST API exposes dataset usage, refresh history, workspace membership, and endorsement status. Build an automated monitoring dataset that surfaces semantic layer health KPIs to your governance team — who's using the certified datasets, which reports have broken connections, which datasets haven't been refreshed in a week.

    5. Plan for Fabric. Microsoft Fabric's lakehouse and semantic model architecture extends these concepts significantly. The OneLake storage layer, delta tables as direct sources for semantic models, and the unified workspace model in Fabric are where this architectural pattern is heading. Understanding cross-workspace dataset sharing in Power BI Premium is the direct prerequisite for understanding the semantic model layer in Microsoft Fabric.

    Work With Us

    From insight to implementation

    Reading is the start. When you're ready to build the data, automation, or AI systems behind it, our team turns strategy into shipped results.

    Let's Build

    Enterprise Power BI

    Previous

    Implementing Power BI Report Subscriptions and Data-Driven Alerts at Enterprise Scale for Automated Stakeholder Delivery

    Next

    Power BI Parameters and Templates: Standardize Enterprise Data Source Configuration

    Related Insights

    Power BIPractitioner

    Mastering Power BI Tooltip Pages: Building Custom Visual Tooltips with DAX Measures and Drillthrough Context for Richer Report Interactivity

    22 min
    Power BIFoundation

    Implementing Power BI Gateway Clusters for High Availability and Load Balancing of Enterprise On-Premises Data Connections

    20 min
    Power BIFoundation

    DAX Implicit vs Explicit Measures: Why Auto-Generated Measures Fail in Complex Reports and How to Replace Them

    17 min

    On this page

    • Introduction
    • Prerequisites
    • Understanding the Architecture Before You Build It
    • What Happens Under the Hood
    • The Three-Tier Workspace Model
    • Building the Semantic Layer Dataset
    • Designing for Reusability
    • Building for RLS from Day One
    • Publishing and Configuring the Semantic Layer Workspace
    • Workspace Configuration
    • Configuring Dataset Settings
    • Endorsement: Making Your Dataset Discoverable
    • Connecting Reports to the Shared Dataset
    • From Power BI Desktop
    • From Power BI Service: Create Reports on Datasets
    • Managing the Cross-Workspace Reference
    • Composite Models: When Live Connection Isn't Enough
    • Understanding Composite Model Architecture
    • Relationships Across the Composite Boundary
    • RLS in Composite Models
    • Deployment Pipelines and Dataset Lifecycle Management
    • Setting Up a Pipeline for the Semantic Layer
    • The Critical Insight About Live Connections and Pipelines
    • XMLA Endpoint: The Power User's Tool
    • Performance Optimization for a High-Traffic Semantic Layer
    • Monitoring Query Performance
    • Aggregations: The Performance Multiplier
    • Import vs. DirectQuery: The Architecture Decision
    • Hands-On Exercise
    • Setup
    • Step 1: Build the Semantic Layer Dataset
    • Step 2: Publish and Configure
    • Step 3: Connect from a Separate Workspace
    • Step 4: Verify the Live Connection
    • Common Mistakes & Troubleshooting
    • "Dataset not found" after workspace move
    • RLS not applying to composite model local tables
    • Report authors building local copies instead of using the shared dataset
    • Performance degradation under concurrent load
    • Composite model relationship issues
    • Scheduled refresh failing for shared dataset
    • Summary & Next Steps