使用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
的代码,它使用 DacServices
(Microsoft.SqlServer.Dac
、System.Data.SqlLocalDb
、System.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.dll
和 Microsoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentPlanGenerator.OnInitialize(SqlDeployment)
。如果设置了该标志,它会跳过整个连接到数据库和从部署的 T-SQL
到模型的逆向工程。
这可能会导致一个潜在的错误,即人们更改模型数据库以包含一些对象,然后使用 SSDT 部署模型数据库中的对象,但随着边缘情况的发生,这听起来很低!
按照 TheGameiswar 的建议,通过使用 Parallel.Foreach
并行化代码也可以提高多数据库情况下的性能。
我们正在部署到 MS SQL Server
localdb
进行集成测试。
我们构建了一个数据库项目,并复制了生成的 dacpac
文件,以便 IntegrationTests 项目使用。到目前为止我们有:
DatabaseProject.sqlproj
bin/debug/DatabaseProject.dacpac
IntegrationTests.csproj
bin/debug/DatabaseProject.dacpac
我们在 IntegrationTests 项目中有一个程序集设置,其中创建了一个新的数据库并将 dacpac
部署到 localdb
。在 TearDown 中,数据库被删除,因此我们有一个确定的测试状态。
这是部署 dacpac
的代码,它使用 DacServices
(Microsoft.SqlServer.Dac
、System.Data.SqlLocalDb
、System.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.dll
和 Microsoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentPlanGenerator.OnInitialize(SqlDeployment)
。如果设置了该标志,它会跳过整个连接到数据库和从部署的 T-SQL
到模型的逆向工程。
这可能会导致一个潜在的错误,即人们更改模型数据库以包含一些对象,然后使用 SSDT 部署模型数据库中的对象,但随着边缘情况的发生,这听起来很低!
按照 TheGameiswar 的建议,通过使用 Parallel.Foreach
并行化代码也可以提高多数据库情况下的性能。