2017-03-21 17 views
0

我有一個使用實體框架6.1和 的C#.NET 4.5控制檯應用程序我使用工作單元模式。代碼的典型例子,我需要一個條目添加到我的tblFills表:使用本地sqlexpress與EF加速性能超過預期。爲什麼?

var fillRep = UnitOfWork.Instance.GetRepository<tblFills>(); 

    fillRep.Add(fill); 

    UnitOfWork.Instance.Commit(); 

我的一個模擬,使900數據庫寫入。

使用遠程服務器(在遠程雲服務器上託管SQL Server),我的模擬需要6:21分鐘(6分21秒)。這是平均每個交易25秒(它也在做其他事情)。 在我的代碼開始時,我將10個數據庫寫入到一個虛擬表中來計時......然後用10來分數來獲得我的平均數據庫訪問時間。該仿真顯示了61ms的訪問時間。

我的性能測試代碼:

Private void SqlPerformanceTest() 
{ 
    Logger.Debug("Starting SQL Performance Test..."); 
    int iterations = 10; 
    TempPerformance tp = new TempPerformance(); 
    tp.Quantity = 10; 
    TimeSpan startTime = DateTime.Now.TimeOfDay; 
    for (int i = 0; i < iterations; i++) 
    { 
     UnitOfWork.Instance.GetRepository<TempPerformance>().Add(tp); 
     UnitOfWork.Instance.Commit(); 
    } 
    DateTime elapsedTime = DateTime.Now.Subtract(startTime); 
    Logger.Debug("Done. Average SQL access for adding entires is: {0} ms", elapsedTime.TimeOfDay.TotalMilliseconds/iterations); 
} 

我然後我的連接字符串切換到我已運行的本地SQLEXPRESS實例,我的模擬時間從超過6分鐘的時間爲10秒。

這對我來說沒有任何意義,因爲我相信我的數據庫訪問時間是兩次模擬的唯一區別。

有人可以幫我理解嗎?

總結: 1)使用數據庫訪問時間爲61毫秒的外部數據庫,對數據庫進行900次寫入,模擬時間超過6分鐘。 2)使用本地數據庫,同樣的模擬需要10秒鐘。

任何幫助或指針將真正讚賞。

我的遠程服務器在Windows 2008 Server R2 Datacenter上運行SQL Server 2014。我不認爲這很重要,因爲我測量訪問時間,但認爲我會提及它。

感謝 -Ed

回答

0

回答你的問題是這樣的句子:遠程雲服務器

這不是數據庫的訪問時間,但這裏統計的網絡延遲時間。根據存儲庫和服務客戶​​端的實現方式,您的應用程序可能會相當健談。在當地它並不重要,但使用雲會產生很多不同。

請確保您運行測試您的應用程序遠程部署(即不是從本地PC連接到遠程SQL Server)。檢查數據庫設置以確定地理位置,因此您確信數據庫服務器和應用程序服務器位於相同的位置並完全位於同一數據中心內。

但請注意,由於此方案根本不使用網絡接口,因此您將永遠無法獲得與單層(託管在同一臺計算機上的sql +應用程序服務器)一樣好的結果。

+0

謝謝。我想我理解你的回答......我上面所做的61ms往返測量不會完全測量:服務器+ SQL延遲?但我同意你最後的聲明,我會嘗試在同一臺服務器上實現app + db,儘管我需要一個鏡像...... –

相關問題