Join us at FabCon Atlanta from March 16 - 20, 2026, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.
Register now!The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now! Learn more
Hi Fabric Community,
I'm currently working on optimizing an incremental refresh strategy in Microsoft Fabric and would appreciate your insights on the best combination of tools and destinations.
Which ingestion method is best suited for this use case?
Which destination is most appropriate for incremental refresh and reporting?
Do I need to stage the data in a Bronze layer first and then merge into a Gold layer?
Is there a recommended pattern for handling updates efficiently (e.g., using watermark tables, CDC, or timestamp filters)?
Achieve a reliable and scalable incremental refresh setup that supports:
Any best practices, architecture suggestions, or lessons learned from similar implementations would be greatly appreciated.
Thanks in advance!
Alaa Abdulhady
Solved! Go to Solution.
Hi @Alaahady,
Hope you had a chance to try out the solution shared earlier. Let us know if anything needs further clarification or if there's an update from your side always here to help.
Thank you.
Hi,
Thank you all for your support. I was able to resolve the issue by following these steps:
here is the notebook code:
Hi @Alaahady,
Thank you for reaching out to the Microsoft Fabric Community Forum. Also, thanks to @tayloramy, for his inputs on this thread.
This is a common pattern when working with on-prem SQL Server sources and incremental refresh in Fabric. Here’s a practical approach you can consider:
Ingest only changed rows: Use a Copy Activity or Copy Job via a self-hosted Integration Runtime to pull only rows where last_update_date is greater than the latest value in your destination (watermark). This keeps your ingestion lightweight and avoids unnecessary full-table copies.
If you can enable Change Data Capture (CDC) on SQL Server, it’s even more robust for inserts/updates/deletes.
Landing zone (Bronze layer): Store the delta rows in a Bronze Delta Lakehouse table. Keep this append-only; each pipeline run writes only the new/updated rows.
Upsert into Gold layer: Use a Notebook (Spark) or Dataflow Gen2 to perform a MERGE from Bronze into your Gold Delta table. Match on ID and compare last_update_date to handle inserts/updates atomically.
Expose Gold for reporting: Use the Lakehouse SQL endpoint for smaller concurrency reports. Use a Warehouse if you have high-concurrency or interactive Power BI users.
Refer these links:
1. https://learn.microsoft.com/en-us/fabric/data-factory/dataflow-gen2-incremental-refresh
2. https://learn.microsoft.com/en-us/fabric/fundamentals/decision-guide-lakehouse-warehouse
3. https://learn.microsoft.com/en-us/azure/data-factory/copy-activity-overview
4. https://learn.microsoft.com/en-us/azure/databricks/delta/merge
Hope this clears it up. Let us know if you have any doubts regarding this. We will be happy to help.
Thank you for using the Microsoft Fabric Community Forum.
Hi @Alaahady,
Just checking in to see if the issue has been resolved on your end. If the earlier suggestions helped, that’s great to hear! And if you’re still facing challenges, feel free to share more details happy to assist further.
Thank you.
Hi @Alaahady,
Hope you had a chance to try out the solution shared earlier. Let us know if anything needs further clarification or if there's an update from your side always here to help.
Thank you.
Hi @Alaahady,
You’re dealing with the classic “insert + update” problem from an on-prem SQL Server. The trick is to land only what changed, then upsert efficiently, and serve for reporting. Here’s what I’ve found works consistently.
If you found this helpful, consider giving some Kudos. If I answered your question or solved your problem, mark this post as the solution.