2009-07-24 48 views
1

讓我們:跨數據庫的存儲過程的性能2008

  • $ DB的SQL Server數據庫
  • $ DBSP1含引用$ DB
  • $ DBSP2存儲過程的SQL Server數據庫是完全一樣$ DBSP1
  • $ SP是一個存儲過程

從C#代碼在$ DBSP1運行$ SP大約需要1.5秒。

在$ DBSP2上從C#代碼運行$ SP約需0.5秒。

C#代碼非常簡單,使用SqlClient的默認參數。

當我在$ DBSP1和$ DBSP2的SQL控制檯中執行$ SP時,它需要0.4s。

兩個代碼數據庫之間的唯一區別是$ DBSP1正在生產中,並且已加載一點,而$ DBSP2處於空閒狀態。代碼數據庫中沒有數據,只有$ DB的存儲過程和視圖。

有人可以提出原因,爲什麼會發生這種情況?由於所有的工作都是在$ DB中進行的,在這兩種情況下都是同樣加載的,所以我期望表現會類似。

+0

有趣。在排除機器或網絡性能問題方面,從每臺計算機上的SQL控制檯運行是一個很好的步驟。 「在C#代碼中$ DBSP1上運行$ SP需要大約1.5秒 從C#代碼$ DBSP2上運行$ SP大約需要0.5s。」 你看起來很徹底,所以請原諒我,如果這個問題是補救。當你這麼說 - 是頁面或函數的總執行時間?或者是具體陳述需要的具體時間? – 2009-07-24 14:44:21

+0

C#執行時間度量運行存儲過程的SqlCommand Open()和ExecuteNonQuery()的總和。 我忘了確切地說,所有的數據庫都在同一臺機器上。 – pmezard 2009-07-24 14:48:48

+0

@John Booty:「在C#代碼上運行$ DBSP1上的$ SP約需要1.5秒,從C#代碼運行$ DBSP2上的$ SP大約需要0.5秒。」這正是錯誤的參數嗅探和舊統計的症狀。 – 2009-07-24 14:49:47

回答

1

速度差異來自不同的查詢計劃。 $ SP是一個複雜的存儲過程,它的初始查詢計劃可能會有很大不同,具體取決於第一個查詢。此時我們並沒有控制第一次請求,因爲在部署$ SP後立即發佈了它。

我們嘗試在$ SP級別和查詢級別提供有關$ SP參數的提示,但未獲成功。相反,我們預熱$ SP ,然後部署,並生成正確的查詢計劃。

0

我想你有你的答案。 $ DBSP1正忙。即使大部分工作都在$ DB中進行,它仍然需要切換工作並優先考慮工作。

此外,根據傳輸的數據量,網絡活動發揮作用。如果$ DBSP1正在發送/接收相當數量的數據,則會減少與$ DB通信的可用帶寬量,並會導致結果集傳輸速度變慢。

0

1)檢查兩個服務器對每個表

2)重建索引(或者至少,UPDATE STATISTICS)

你有定期的索引維護作業計劃定義的相同指標?聽起來像過時的統計數據或零散的索引造成的差異..

0

建議您運行分析器,看看發生了什麼,但通常生產數據庫上的工作量使得一切運行速度變慢。統計信息可能已過時。根據我的經驗,兩臺服務器之間的性能很少相同。

0

措施。

SET STATISTICS TIME ONSET STATISTICS IO ON添加到您的C#並在sql控制檯調用以及。在C#中,掛接SqlConneciton.InfoMessage event以捕獲信息消息並顯示它們。也將SqlConnection.Open()調用和SqlCommand.ExecuteNonQuery調用的時間分開。

然後你就可以分辨出不同。

  • 不同的啓示Open()times?
  • 不同的編譯/執行時間?
  • 不同的邏輯讀取/物理讀取比例?
  • 不同的邏輯讀取計數?