2017-04-12 41 views
3

我們正在部署到MS SQL Serverlocaldb進行集成測試dacpac部署的性能。提高使用C#

我們建立了一個數據庫項目,並將所得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 
     ); 
} 

,大約需要787-8部署每一個。這增加了執行測試的總時間。

是否有可能以某種方式提高dacpac的部署表現?

+1

Visual studio提供了找出跟蹤哪些語句需要花費時間的方法,嘗試微調它們。如果您無法對它們進行微調,請嘗試使用並行性來並行部署多個項目。 – TheGameiswar

+2

您是否真的需要創建數據庫在一個單獨的步驟?如果不自己測試,'dacservices'可能會將dacpac中的所有對象與空數據庫中的對象進行比較。 –

+0

@GavinCampbell,TheGamesiwar,你的評論都很有用,並且允許我將4個數據庫的總體時間從25秒縮短到4.5秒。 – jruizaranguren

回答

3

加文是正確的!

不要撕數據庫下來,而不是使用創建新數據庫選項,這樣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存在的潛在問題,部署一個對象,它是在模型數據庫,但作爲邊緣情況去,這聽起來相當低!

性能也可用於多個數據庫的情況下通過與Parallel.Foreach並行化代碼的提高,通過TheGameiswar的建議。

+0

謝謝,埃德。我已經添加了所需的代碼。正如我在前面的評論中所說的,在4個數據庫的初始化過程中,我從25秒降到了4.5秒。 – jruizaranguren

+0

是的,我不確定是否有任何localdb的「特殊考慮因素」會阻止這種方法的工作;顯然沒有! –

+0

小調:DacPackage對象是一次性的。我會建議處理他們。 –