Back to Blog
Published:
Last Updated:
Recently Updated
ERP Write-Back & IntegrationChapter 7

Why are virtual tables fast in the demo and slow in production?

8 min read
1,808 words
high priority
Mudassir Marwat

Mudassir Marwat

Founder & CEO, Cognilium AI

TL;DR

Because a demo has one entity, few rows and co-located environments, and production has none of those. Across the virtual entities overview, the virtual entities FAQ and the entity-modeling page, the only virtual entity overhead figure Microsoft publishes is for the co-located case; there is an FAQ answer headed "The virtual entity performance is slow when a virtual entity has relationships to other entities"; and Microsoft states that the exemption applies only to the Finance and Operations endpoints the virtual entity plugin invokes, and that because the request is made through the Dataverse API, Dataverse service protection limits might still apply to it.

Why are virtual tables fast in the demo and slow in production?

Because a demo is one entity, a handful of rows, and two co-located environments — and production is none of those. Virtual tables [GA] hold no local copy of the data. Every query is a live call into the ERP at the moment it is asked, so everything that grows between demo and production grows the call.

Three documented mechanisms explain the gap, and a fourth failure in this family is not a performance problem at all. One of the three carries an FAQ heading that says the quiet part outright, and none of them is visible in a short demo.

Mechanism one: there is no local copy, so distance is priced into every query

The Virtual entities overview (page dated 2026-01-21) states the design: "By definition, the data for virtual entities doesn't reside in Dataverse. Instead, it continues to reside in the app where it belongs."

A query is not a lookup against a replica — it "causes a Secure Sockets Layer (SSL)/Transport Layer Security (TLS) 1.2 secure web call to the CDSVirtualEntityService web API endpoint of finance and operations apps." Then the deployment note:

"For optimal latency in virtual entity calls, always use finance and operations apps and Dataverse that are co-located in the same Azure region. When finance and operations apps and Dataverse are co-located, the virtual entity overhead is expected to be less than 30 milliseconds (ms) per call."

Read what is and is not published there. Microsoft gives a figure for the co-located case and an instruction to always co-locate. It publishes no figure for environments in different regions — not on that page, not on the virtual entities FAQ, not on the entity-modeling page, the three Microsoft pages on this feature opened here. The only overhead number Microsoft stands behind is conditional on a choice made when the environments were created. Ours is the inference that follows: region is a property of an environment, so correcting it is an environment move, not a tuning exercise.

Mechanism two: relationships, and Microsoft's own heading calls it slow

The finance and operations virtual entities FAQ carries a question headed "The virtual entity performance is slow when a virtual entity has relationships to other entities. Is there guidance on how to avoid these problems?" The answer names the mechanism and hedges its own completeness:

"Performance can be slow for several reasons when a virtual entity has relationships to other entities. This section will be updated as new patterns are identified. The following guidance reflects current knowledge. When virtual entities have relationships to other entities, the virtual entity framework needs to query the related entities if the field select list includes the foreign key values for the related entities. By default, queries against the entities return all fields unless the caller requests a specific set of fields. Specify a narrow select list to help prevent slow performance."

There is the demo-to-production gap in two sentences. The default is to return every field, and every foreign key in that list triggers a query against the related entity. A demo entity with no relationships returns in one call; the same entity in a configured production model returns in one call plus a query against each related entity whose foreign key sits in the select list.

Entity modeling explains why the count grows quietly: generating the virtual table adds a lookup field per relation, so "you create the same number of lookup fields (one per related entity) in the source virtual entity."

Microsoft's worked treatment sits on a Human Resources page, Optimize Dataverse virtual table queries, stamped "Applies to these Dynamics 365 apps: Human Resources" and to be read with that scope. It names four symptoms: slow query execution, query timeout, an unexpected error, and throttling.

Mechanism three: the exemption trap — you moved the meter, you did not remove it

This is the most misunderstood thing in the subject, and Microsoft resolves it in one paragraph.

Virtual tables are on the exemption list on Service protection API limits (page dated 2026-01-20), introduced with a hedge — "The following services are currently exempt from them" — as "Power Platform virtual tables for finance and operations apps". Then the paragraph that decides the design:

"The exemption for virtual tables applies only when the Microsoft Power Platform integration with Finance and Operations apps is enabled. The service protection API limits apply to virtual tables if the integration isn't enabled for the Finance and Operations apps environment. When the integration is enabled, the exemption applies only to the Finance and Operations apps API endpoints that the virtual entity plugin invokes. The Finance and Operations apps service doesn't throttle the request. However, because the request is made through the Microsoft Dataverse API, Service protection API limits might still apply to the request."

Both halves, in Microsoft's words. The exemption is conditional on the integration being enabled, covers only the finance and operations endpoints the plugin calls, and leaves the Dataverse meter running. Keep Microsoft's "might still apply": the page does not promise the Dataverse limits will bite, only that the exemption does not remove them.

That these are genuinely different meters is provable from the error strings. The Dataverse service protection API limits page (dated 2026-01-09) publishes error code -2147015902, hex 0x80072322, message Number of requests exceeded the limit of 6000 over time window of 300 seconds.

The finance and operations page publishes "Number of requests exceeded the limit of 6000 over the time window of 300 seconds." Same reading, different meter, different string — down to one word.

A second trap is folded inside. On the finance and operations side, user-based limits were disabled by default in version 10.0.35 and, in 10.0.36, "the limits are disabled on all environments, and the option to enable the limits is removed." An architect who knows that can conclude the request limit is behind them. The Dataverse limits page describes its own as live and evaluated per user — and that is the API the request is made through, which is why Microsoft says its limits might still apply.

The failure that is not a performance failure at all

One symptom in this family is an identity problem wearing a latency costume, and Microsoft's claim about it is narrower than the version that circulates. From Authorization on the overview:

"The Dataverse SYSTEM user doesn't have access to all entities in finance and operations, nor do the out of the box service-to-service applications. Failure to use a proper user or app-user context might result in errors with messages like Unable to determine the user in CDS."

The SYSTEM user lacks access to all entities — not access altogether — and a wrong context "might result in errors with messages like" that string. Both hedges are Microsoft's and both earn their place, because the second is why this gets misdiagnosed: one misconfiguration surfaces differently depending on the entity. The fix is to associate the organization context with an application or end user that has permissions to the virtual entity in finance and operations.

What a demo cannot show you

  • One entity, no relationships — What production has: Several relations, each adding a lookup field · Documented consequence: The framework queries the related entities when foreign keys are in the select list
  • A narrow result by accident — What production has: The same default over a wide entity · Documented consequence: Queries "return all fields unless the caller requests a specific set of fields"
  • Co-located environments — What production has: Whatever the tenant was built with · Documented consequence: Microsoft's overhead figure is stated for the co-located case only
  • One tester — What production has: Concurrent users, flows and service-principal integrations, all metered on the Dataverse side · Documented consequence: Dataverse limits are evaluated per user and each authenticated user has an independent limit — and the exemption does not reach them

Where we would draw the line

We use virtual tables for the read they are good at, and we do not build an Optimizer's bulk read on them. A live projection with no copy is right for reading a record in context, and it is the cleanest expression of not touching the ERP core: nothing is replicated, nothing is installed on the ERP, and the query runs as a looked-up finance and operations user inside a named Security Role.

It is the wrong instrument for pulling a season of demand history to optimize a safety-stock level. That read is wide and repeated, and each mechanism above scales against it. For that we read through a surface built for volume, compute on Azure in your tenant, then write the optimized value back through a narrow approved path — surrounding the ERP rather than sitting inside it.

What to check this week

  1. Confirm whether your Dataverse and Finance and Operations environments share an Azure region. Across the virtual entities overview, the virtual entities FAQ and the entity-modeling page, the only overhead figure Microsoft publishes is conditional on co-location; region is set when the environment is created.
  2. Open any Power App or report on a virtual table and look at its select list. If nobody narrowed it, the default returns all fields and pulls the foreign keys with them.
  3. Count the lookup fields on your busiest virtual table. Each relation generated one, and each is a potential extra query against a related entity.
  4. Ask which meter your last throttling incident was on. The finance and operations exemption is conditional and does not reach the Dataverse API, and the two publish different strings for it.

About Cognilium Cognilium is the AI optimization layer for Dynamics 365 — complementary apps that optimize the pricing, inventory, warehouse and planning decisions your ERP manages but can't optimize. Built on Power Platform, Dataverse and Azure. https://cognilium.ai · https://www.linkedin.com/company/37180269/

If a virtual table read is slower than the demo suggested and you want the mechanism-by-mechanism version against your own environment, book a fifteen-minute call and we will walk it with you live — no deck. https://cognilium.ai

Sources

Sources

Share this article

The work behind this series

Six patterns, and the four published limits that actually decide which one survives production — service protection, OData throughput, business-event ordering and recurring-integration redelivery.

Mudassir Marwat

Mudassir Marwat

Founder & CEO, Cognilium AI

Mudassir Marwat's argument is that ERP systems record decisions they never optimise.

Founder & CEO of Cognilium AI; 37 AI agents in production across four products; 4 production AI products built and operated; three clouds in production (AWSGCPAzure)
Agentic AIRAG → GraphRAG retrievalVoice AIMulti-Agent Orchestration
In short

Key takeaways

  • Virtual tables hold no copy of the data. Microsoft states the rows continue to reside in the finance and operations app, so every query is a live call and anything that grows between a demo and production grows the call rather than the cache.
  • Microsoft publishes a virtual entity overhead figure for environments co-located in the same Azure region and instructs you to co-locate; across the virtual entities overview, the virtual entities FAQ and the entity-modeling page, no figure is published for the cross-region case. Region is chosen when an environment is created; our reading is that this makes it a deployment decision rather than a tuning one.
  • Microsoft's own FAQ heading states that virtual entity performance is slow when a virtual entity has relationships to other entities, and names the cause: the default is to return all fields, and foreign key values in the select list make the framework query the related entities.
  • The service protection exemption for virtual tables moves the meter rather than removing it. Microsoft states the exemption covers only the finance and operations endpoints the virtual entity plugin invokes, and that because the request goes through the Dataverse API, the Dataverse service protection limits might still apply.
  • The Dataverse SYSTEM user is documented as not having access to all finance and operations entities. A plugin that reads a virtual table under the wrong context is an identity problem, not a performance problem, however it first presents.
What goes wrong

Common mistakes to avoid

  • Reading the exemption as "virtual tables are not throttled". Microsoft scopes it to the finance and operations endpoints the plugin invokes, makes it conditional on the Power Platform integration being enabled, and says the Dataverse limits might still apply to the same request.
  • Accepting the default select list. Microsoft states that queries return all fields unless the caller requests a specific set, so the narrow select list is something you do rather than something you get.
  • Benchmarking on a demo environment and carrying the result into a design. A demo typically has one entity, no relationships and co-located environments, and each of those is a mechanism Microsoft documents as affecting the call.
  • Assuming a Dataverse plugin can read a virtual table under the SYSTEM context. Microsoft's guidance is to associate the organization context with an application or end user that has permissions to the virtual table in finance and operations.

Terms in this article

Definitions in the Cognilium glossary.

Still have a question this did not answer?

The person who wrote this article answers these. Describe your setup and what you are stuck on — you will get a straight answer, including where we think the approach is wrong.

Related Articles

Continue exploring related topics and insights from our content library.

9 min
1
Mudassir Marwat
August 1, 2026

How do you move a million rows into Dynamics 365 without breaking it?

The answer is the Data management framework's package REST API, in batch — and the value is four operational facts the call itself never tells you: the caller cannot parallelise it, parallel package import is a precondition, the blob file lives seven days, and error retrieval is two-phase and polled with an ambiguous empty response. Each verified against Microsoft's page, operation names character-exact.

words
Read Article
8 min
2
Mudassir Marwat
August 1, 2026

Is BYOD retired?

Microsoft's transition FAQ answers this under its own heading, on a page revised in July 2026 — a retirement date for BYOD hasn't been determined, and Microsoft recommends transitioning in the same sentence. Both halves are the answer. Here are the five Microsoft pages checked, the four dates Microsoft documents for Export to Data Lake, why any single-date summary of it is wrong, and why a bounded no is still not a reason to stay.

words
Read Article
8 min
3
Mudassir Marwat
August 1, 2026

Did the Synapse trusted-services firewall exception retire on 1 August 2026?

The retirement was dated 1 August 2026. On the day, Microsoft's transition FAQ still states it in the future tense on a page revised in July, while a Microsoft Q&A answer describes a move to 2027. Here is what nine Microsoft pages say, the date each one carries, and what to check in your own tenant.

words
Read Article

Explore More Insights

Discover more expert articles on AI, engineering, and technology trends.

Personalized for You

Curated content recommendations based on your current reading and interests.

Trending
117%

Business events give you no ordering guarantee. What do you build instead?

Same topic cluster: ERP Write-Back & Integration
Same author: Mudassir Marwat

Microsoft states it under a heading called Limitations - the order in which Finance and Operations emits business events isn't guaranteed to preserve the order in which they're delivered. The control number is a dedupe key, not a sequence. So you build consumers that are idempotent, derive state from the record rather than the event sequence, and reconcile against the ERP rather than against the event stream.

Mudassir Marwat
8 min read
ERP Write-Back & Integration
Read Article
Trending
37%

Why do received goods sit uninvoiced, and what can an agent actually do about it?

High priority content
Related topic cluster: Procure-to-Pay Agent Operations

Dynamics 365 already matches product receipts to invoices hourly or daily. The balance that will not clear is the residue the automation cannot resolve.

Ali Ahmed
7 min read
Procure-to-Pay Agent Operations
Read Article
Trending
117%

Is BYOD retired?

Same topic cluster: ERP Write-Back & Integration
Same author: Mudassir Marwat

Microsoft's transition FAQ answers this under its own heading, on a page revised in July 2026 — a retirement date for BYOD hasn't been determined, and Microsoft recommends transitioning in the same sentence. Both halves are the answer. Here are the five Microsoft pages checked, the four dates Microsoft documents for Export to Data Lake, why any single-date summary of it is wrong, and why a bounded no is still not a reason to stay.

Mudassir Marwat
8 min read
ERP Write-Back & Integration
Read Article
Trending
117%

Why do your data events never fire for some entities?

Same topic cluster: ERP Write-Back & Integration
Same author: Mudassir Marwat

Microsoft names the class exactly - when a data entity uses a view as its primary data source, data events don't trigger. Not all views, not all entities - the entity's primary data source. This article gives Microsoft's wording and its stated reasons, the separate temporary-table case that raises an error instead of staying silent, and the published throughput figures that Microsoft says the environment does not explicitly throttle.

Mudassir Marwat
8 min read
ERP Write-Back & Integration
Read Article
Trending
117%

What does dual-write actually cost you in transaction budget?

Same topic cluster: ERP Write-Back & Integration
Same author: Mudassir Marwat

A budget with three published lines. Microsoft states a two-minute transaction time limit that includes the time to process standard and custom Dataverse plugins, a ceiling of 1,000 records per single transaction in the finance and operations to Dataverse direction, and a plan of record restricting dual-write to a one-to-one mapping. Every dual-write write spends from all three, and the bill arrives at posting time.

Mudassir Marwat
8 min read
ERP Write-Back & Integration
Read Article
Trending
117%

What can't Dynamics 365 do natively for EDI?

Same topic cluster: ERP Write-Back & Integration
Same author: Mudassir Marwat

Finance and Operations publishes a substantial electronic-document capability — a configurable format engine, an electronic invoicing service, inbound and outbound ASN objects, and file-based integration with transformation. What none of those pages documents is the EDI layer itself: encode and decode, trading partners and agreements, envelope control numbers, acknowledgements and the transports. Microsoft documents those, in Azure. This is the scoping brief, with the pages searched named against each gap.

Mudassir Marwat
10 min read
ERP Write-Back & Integration
Read Article

Smart Recommendations

Our AI analyzes topic clusters, author expertise, and content relationships to surface the most relevant articles for you.

Topic Matching
Author Expertise
Content Quality
Personal Interests

Questions on this?

Talk to an engineer

Schedule a call