使用c#提高dacpac部署的性能

Improve the performance of dacpac deployment using c#

我们正在部署到 MS SQL Server localdb 进行集成测试。

我们构建了一个数据库项目,并复制了生成的 dacpac 文件,以便 IntegrationTests 项目使用。到目前为止我们有:

DatabaseProject.sqlproj
    bin/debug/DatabaseProject.dacpac
IntegrationTests.csproj 
    bin/debug/DatabaseProject.dacpac

我们在 IntegrationTests 项目中有一个程序集设置,其中创建了一个新的数据库并将 dacpac 部署到 localdb。在 TearDown 中,数据库被删除,因此我们有一个确定的测试状态。

这是部署 dacpac 的代码,它使用 DacServicesMicrosoft.SqlServer.DacSystem.Data.SqlLocalDbSystem.Data.SqlClient):

public void CreateAndInitializeFromDacpac(
ISqlLocalDbInstance localDbInstance,
string databaseName,
string connectionString,
string dacpacPath)
{

    using (var cx = localDbInstance.CreateConnection())
    {
        cx.Open();
        using (var command = new SqlCommand(
            string.Format("CREATE DATABASE {0}", databaseName), cx))
            command.ExecuteNonQuery();
    }

    var svc = new DacServices(connectionString);

    svc.Deploy(
        DacPackage.Load(dacpacPath),
        databaseName,
        true
        );
}

我们现在有几个数据库项目,部署每个项目大约需要 8 秒。这会增加执行测试的总时间。

是否有可能以某种方式提高 dacpac 的部署性能?

加文是对的!

不要拆除数据库,而是使用 创建新数据库 选项,这样 SSDT 就不必浪费时间比较两个模型,因为它知道一个是空.

部署代码应更改为:

var dacOptions = new DacDeployOptions { 
               CreateNewDatabase = true
            };

svc.Deploy(
    DacPackage.Load(dacpacPath),
    databaseName,
    true, 
    options: dacOptions
    );

如果您设置此标志,SSDT可以执行大量其他优化 - 如果您不愿意使用反射器,请查看 Microsoft.Data.Tools.Schema.Sql.dllMicrosoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentPlanGenerator.OnInitialize(SqlDeployment)。如果设置了该标志,它会跳过整个连接到数据库和从部署的 T-SQL 到模型的逆向工程。

这可能会导致一个潜在的错误,即人们更改模型数据库以包含一些对象,然后使用 SSDT 部署模型数据库中的对象,但随着边缘情况的发生,这听起来很低!

按照 TheGameiswar 的建议,通过使用 Parallel.Foreach 并行化代码也可以提高多数据库情况下的性能。