C#

2017-04-12 12 views
3

을 사용하여 dacpac 배포의 성능 향상 통합 테스트를 위해 MS SQL Serverlocaldb으로 배포하고 있습니다.C#

데이터베이스 프로젝트를 빌드하고 결과로 dacpac 파일이 복사되어 IntegrationTests 프로젝트에서 사용됩니다. 지금까지 우리는이 :

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

우리는 새로운 신선한 데이터베이스가 생성되는 IntegrationTests 프로젝트에서 조립 설치를하고 dacpaclocaldb에 배포됩니다. 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 
     ); 
} 

우리는 이제 데이터베이스 프로젝트의 몇 가지를 가지고있다, 그것은 배포하는 방법에 대한 8S 소요 각각. 이는 테스트를 실행하는 전체 시간을 증가시킵니다.

어떻게하면 dacpac의 배포 성능을 향상시킬 수 있습니까?

+1

비주얼 스튜디오는 어떤 진술이 시간이 걸리는지 추적 할 수있는 방법을 제공합니다. 미세 조정할 수 없으면 병렬 처리를 사용하여 여러 프로젝트를 병렬로 배포하려고합니다. – TheGameiswar

+2

정말로 만들어야합니까? 별도의 단계에서 데이터베이스? 직접 테스트하지 않고,'dacservices'는 dacpac의 모든 객체를 빈 데이터베이스의 객체와 비교할 수 있습니다. –

+0

@GavinCampbell, TheGamesiwar, 귀하의 의견은 유용하며 25 개에서 4.5 개로 4 개 데이터베이스의 전체 시간을 단축 할 수있었습니다. – jruizaranguren

답변

3

개빈이 맞습니다!

새 데이터베이스 만들기 옵션을 사용하지 마십시오. 따라서 SSDT은 비어있을 때 두 모델을 비교하는 데 시간을 낭비 할 필요가 없습니다.

배포의 코드로 변경해야합니다

이 플래그를 설정하면 SSDT 할 수있는 추가 최적화의 부하가 있습니다
var dacOptions = new DacDeployOptions { 
       CreateNewDatabase = true 
      }; 

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

- 당신이 반사경을 사용하여 방해 할 수있는 경우 Microsoft.Data.Tools.Schema.Sql.dll를 보라가와 Microsoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentPlanGenerator.OnInitialize(SqlDeployment). 이 플래그가 설정된 경우 전체를 건너 뛰고 데이터베이스에 연결하고 배포 된 T-SQL의 리버스 엔지니어링을 모델에 적용합니다.

사람들이 모델 데이터베이스를 변경하여 일부 개체를 포함시키고 SSDT를 사용하여 모델 데이터베이스에있는 개체를 배포 할 수있는 잠재적 인 버그가 될 수 있습니다. 그러나 가장자리의 경우에는 상당히 낮게 들립니다.

TheGameiswar에서 제안한대로 Parallel.Foreach 코드를 병렬 처리하여 여러 데이터베이스의 성능을 향상시킬 수도 있습니다.

+0

감사합니다. 나는 필요한 코드를 추가했다. 앞서 언급 한 내용을 추가하면서 4 개의 데이터베이스를 초기화 할 때 25 대에서 4.5대로 줄었습니다. – jruizaranguren

+0

그래,이 접근 방식을 멈추게 할 localdb에 대한 "특별한 고려 사항"이 있는지는 확실하지 않았다. 분명히 없다! –

+0

마이너 참고 : DacPackage 개체는 일회용입니다. 나는 그들을 처분 할 것을 조언 할 것이다. –