2009-08-17 120 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