Skip to main content

Sync Group - Let's talk about Performance

In one of my latest post I talked about synchronization functionality that is available for SQL Azure. There was a question related of the performance of this service.
So, I decided to make a performance test, to see what are the performance. Please take into account that this service is in the preview and the performance will change when the service will be released.
For this test I had the following setup:
  • Database
    • Size 7.2 GB
    • 15 tables
    • 2 tables with more than 30.000.000 of rows (one table had around 3.2 GB and the other one had 2.7 GB)
    • 34.378.980 rows in total
  • Database instances
    • 1 DB in West Europe (Hub)
    • 1 DB in West Europe
    • 1 DB in North Europe
    • 1 DB in North Central US
  • Agent
    • 1 agent in West Europe
  • Configuration
    • Hubs win
    • Sync From Hub
Scenario One: Initialize Setup
I started from the presumption that your data were not duplicated yet on all the databases. First hit of the Sync button will duplicate the database schema of the tables that needs to be sync, table content and rest of resources to all the databases for the given table. This means that 7.2 GB were send to the 3 different databases.
Normally you can do this action in other ways. Exporting/Importing the database for example, but I wanted to see how long it takes to sync all the databases.
Sync action duration: 5 hours and 36 minutes (20160.17 seconds)
Scenario Two: Update 182 rows
In this scenario I updated 182 rows from one of the tables
Sync action duration: 53.63 seconds
 Scenario Three: No changes
In this case I triggered the synchronization action without any changes.
Sync action duration: 38.47 seconds
 Scenario Four: 23.767 rows updated
23767 rows were updated on the hub database.
Sync action duration: 1 minute and 16 seconds (76 seconds)
 Scenario Five: 4.365.513 rows updated
As in the previous scenario, I updated  I changed a specific number of rows.
Sync action duration: 1 minute and 41 seconds (101.6 seconds)
 Scenario Six: 76.353 rows deleted
From one of the tables I deleted 73.353 rows.
Sync action duration: 56.26 seconds
As we can see, the synchronization action itself takes a very short period of time. For 4.5M of rows that were updated, the synchronization action took less than 2 minutes. The only scenario that took a log period of time was the initial synchronization action. Usually this action is made only one time. Also we have other method to import the database content to all our database.
I would say that the performance of the sync service is very good and I invite all of you tot check it out. You have support for synchronization out of the box.
Great job!


  1. Thank you for taking your time to test and share the performances. The performances seems to be very good. I know the service creates triggers for each table involved in sync and it also creates additional tables to keep differences. Do you see a problem with database size in time? Especially because size could involve additional cost in Azure.


Post a Comment

Popular posts from this blog

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…