Forum Discussion
Architecture Best Practice
Current Architecture and Challenges
We currently operate approximately 32 Fabric workspaces, each with its own Open Mirroring Database (OMDB).
Users access data in several ways:
- Querying the SQL endpoint directly from tools such as Excel.
- Creating and querying SQL views within the SQL endpoint.
- Connecting semantic models to SQL views hosted on the SQL endpoint.
- Building reports against semantic models that ultimately source data from the SQL endpoint.
Since the recent changes to the Fabric metering model, we have experienced a significant increase in capacity consumption. This appears to be driven by a combination of:
- Users refreshing Excel workbooks multiple times per day against SQL endpoints.
- Reports and ad hoc queries being executed directly against SQL endpoints.
- Semantic models being refreshed several times per day, in some cases up to 8 refreshes daily.
- Multiple workspaces generating concurrent query workloads against OMDB SQL endpoints.
Current Architecture:
Would appreciate any advice on approaches that could help reduce both user-driven and system-driven SQL Endpoint CU consumption under the new metering model, while still maintaining a good user experience.
Ideally, we're looking for solutions that:
- Reduce capacity usage and associated costs.
- Minimize the impact of ad hoc user queries, Excel refreshes, and semantic model refreshes.
- Avoid introducing significant performance degradation or noticeably slower refresh times.
- Scale effectively across multiple workspaces and customers.
- Allow us to continue providing a responsive reporting experience without users experiencing delays or timeouts.
We would be particularly interested in feedback on:
- Whether SQL Pools could help reduce overall CU consumption in our scenario, and if so, what types of workloads would benefit most.
- Recommended architectural patterns for separating reporting workloads from Open Mirroring Database SQL Endpoints.
- Best practices for serving Power BI, Excel, and other analytical workloads in a way that minimizes Fabric capacity consumption.
- Any real-world experiences or lessons learned following the recent Fabric metering changes.
Any guidance or recommendations would be greatly appreciated.
2 Replies
- Kagiyama_yutakaResponsive Resident
Excel refreshes and model refreshes count as SQL work in Fabric. The two things that actually push SQL CU down are moving Excel users onto a small semantic model and cutting unnecessary refresh cycles. Keeping ad‑hoc SQL behind lightweight views also helps—heavy repeated calls drop off without touching anything risky.
For the bigger architecture angle, separating user‑driven SQL from OMDB—whether via a small SQL Pool or a dedicated serving workspace—is a common pattern to keep concurrency pressure under control.
- ssritharSuper User
Hi FabricEnjoyer ,
I would approach this as a workload/serving-layer issue.
With 32 workspaces, the SQL analytics endpoints are currently serving several different workloads at the same time: Excel refreshes, ad-hoc SQL, semantic-model refreshes, and reporting. Under the current metering model, that can result in significant SQL compute consumption.
I would consider the following approach:
1. Measure the SQL workload first
Before changing the architecture, use the Fabric Capacity Metrics app and SQL monitoring to identify which workspaces and operations are responsible for most of the CU consumption.
I would specifically separate:
- Excel/user-generated SQL
- Ad-hoc SQL queries
- Semantic-model activity
- Scheduled workloads
- Long-running or frequently repeated queries
With 32 workspaces, I would optimize the highest consumers first rather than redesigning everything at once.
2. Don't make the SQL endpoint the default path for every Power BI workload
For Power BI semantic models, evaluate Direct Lake where the model and requirements support it.
Instead of always using:
Evaluate:
This is particularly worth testing if the current architecture is generating significant SQL activity just to serve Power BI.
3. Review semantic-model refresh frequency
If some models are refreshing eight times per day, I would validate whether that frequency is actually required.
Mirroring may already be keeping the underlying data current, so the refresh strategy should match the semantic-model storage mode and actual business latency requirement.
Reducing unnecessary refreshes is one of the first optimizations I would test.
4. Treat Excel and ad-hoc SQL as separate workloads
Excel refreshes and unrestricted ad-hoc SQL can create unpredictable demand.
Where possible, I would provide users with governed semantic models or curated SQL objects rather than unrestricted access to the entire mirrored database.
For users who genuinely require SQL access, consider separating or governing that workload so it doesn't compete with business-critical reporting.
5. SQL Pools can help with workload isolation
Custom SQL Pools are worth evaluating, particularly for separating workloads such as:
The important distinction is that SQL Pools should be viewed primarily as a workload-management/resource-governance mechanism, not as something that automatically makes queries consume less CU.
They can help prevent lower-priority or unpredictable workloads from consuming resources needed by critical reporting.
6. Consider workload isolation across workspaces
Fabric documentation also describes the workspace as a natural SQL compute isolation boundary.
For particularly heavy read workloads, it may therefore be worth evaluating whether all consumers should query the same SQL engine, or whether OneLake/shortcut-based patterns and separate serving workspaces would provide better workload isolation.
I wouldn't introduce this complexity for every workspace without first proving that it solves a measured bottleneck.
Suggested direction
Conceptually, I would move toward:
I would introduce a separate curated Lakehouse/Warehouse serving layer only where there is a genuine requirement for additional transformation, modeling, security, or SQL serving. Adding another layer by itself doesn't guarantee lower CU consumption.
So my priority would be:
Measure → reduce unnecessary refreshes → evaluate Direct Lake → govern Excel/ad-hoc SQL → test SQL Pools for workload isolation → consider additional serving/workspace isolation only where required.
That avoids a large redesign while directly targeting the workloads most likely contributing to the increased SQL Endpoint consumption.
If this post helps, then please appreciate giving a Kudos or accepting as a Solution to help the other members find it more quickly.
If I misunderstand your needs or you still have problems on it, please feel free to let me know. Thanks a lot!