2009-08-17 71 views
1

此問題是previous asked question的後續操作。SQL Server 2005和.NET之間的延遲

我寫了一個看起來像這樣的簡單程序。

string s; 
do 
{ 
    using (SqlConnection conn = new SqlConnection("POOLEDCONN")) 
    { 
    using (SqlCommand cmd = new SqlCommand("", conn)) 
    { 
     s = (string) cmd.ExecuteScalar(); 
     Code2IncrementPerfomanceCounter 
    } 
    }  
} while (!string.IsNullOrEmpty(s)) 

該查詢返回一個字符串(nvarchar(max),當前最大大小爲9k),SQL Server和.NET之間存在大量延遲。 SQL事件探查器說查詢的持續時間爲0毫秒,所以我認爲它不是數據庫。網絡在1 ms內響應,因此它不應該是網絡。

如果我在我們的測試服務器上運行這個代碼(VMWare,SQL沒有虛擬化),每秒最多會有600個循環。該應用程序不會消耗超過5%的cpu。爲什麼不是 更快?我必須使用流來從SQL或其他內容獲取數據嗎?

Thanx預先

+0

嘗試一次打開連接,而不是每次迭代都執行一次。 – Patrik 2009-08-17 15:04:38

+0

你如何確定這個延遲? – 2009-08-17 09:25:10

+0

與性能計數器 – JSC 2009-08-17 09:28:26

回答

1

每秒600個呼叫是每1.7毫秒一個呼叫。如果你的延遲是1毫秒,並且Sql Server增加了一點,那看起來似乎是一個合理的結果?

+1

我明白了,但是如果我在sqlserver上本地運行程序,那麼每秒最多可以有600個調用。 – JSC 2009-08-17 13:20:32

+0

是什麼讓你覺得每秒鐘600(或1200)個查詢太慢了,必須有一個解釋呢? – Andomar 2009-08-17 15:23:26

+0

這並不慢,但我看到了sql-resultset(nvarchar(max))和.net(string)之間的延遲。我們的SQL服務器沒有使用大量的CPU(低於20%),我們的應用程序服務器不會消耗超過5%(如果我們運行它單線程) – JSC 2009-08-17 15:28:44

0

我中有你需要看三個不同的東西:

  1. 在連接到數據庫服務器與TCP/IP或Web服務器是否你使用不同的協議?
  2. 運行dtoNet過程的機器上的網絡有多繁忙?
  3. 如果刪除SQL調用並僅保留性能計數器日誌記錄,性能是否高於600個進程/秒?
+0

1.)SQL Server 2005網絡配置啓用了共享內存和TCP/IP。因此,應用程序服務器將使用TCP/IP,我認爲;-) 2.)網絡利用率低於百分比(Taskmanager 1Gbs) 3)我改變了查詢返回總是相同的記錄,然後它是1200調用/秒 – JSC 2009-08-17 15:24:17

+0

您的連接字符串可以覆蓋默認協議,因此您應該驗證您是否使用TCP/IP進行遠程連接。 Alsom自改變查詢返回一個靜態結果改善了事情,我會說這個問題是查詢本身或查詢返回的數據量(如果你始終超過4K的數據,它將被分割成多個數據包這會讓事情減慢一點)。 – 2009-08-17 15:36:03

0

打開和關閉SQL連接非常昂貴。你可以只做一次嗎?

+0

連接彙集,打開和關閉是免費的。 – Andomar 2009-08-17 15:18:14

+0

.NET在連接字符串上使用連接池,所以這不應該成爲問題。 – JSC 2009-08-17 15:25:33