我有一个C#应用程序,它只是向SQL Server发送一个简单的SQL脚本,并显示来自服务器的响应。
代码如下:
static SqlConnection conn = new SqlConnection("Data Source=servername;Initial Catalog=dbname;User ID=username;Password=password");
static void Main(string[] args)
{
conn.Open();
while (Console.ReadLine() == "")
{
ShowData();
}
conn.Close();
}
static Stopwatch sw = Stopwatch.StartNew();
static void ShowData()
{
var t1 = sw.ElapsedMilliseconds;
var s = @"SELECT TOP (1) [t0].[GroupName] FROM [dbo].[Groups] AS [t0] WITH (NOLOCK) WHERE [t0].[GroupId] = '43ed86d4-42ef-4e6c-9a98-ba48c1f293e7'";
var com = new SqlCommand(s, conn);
var reader = com.ExecuteReader();
if (reader.Read())
{
Console.WriteLine(reader[0]);
}
reader.Close();
Console.WriteLine(sw.ElapsedMilliseconds - t1);
}
应用程序截图:
Wireshark截图:
我按了几次ENTER,响应时间不一致。在我按下的最后6次中,最快的响应是5ms,最慢的响应是29ms。我不确定为什么,似乎应该在服务器中缓存所有响应。
顺便说一下,我已经分析了SQL Server,这些SQL的持续时间都是0.执行计划都是Clustered Index Seek。
答案 0 :(得分:2)
我建议用几种不同的方式来解决这个问题,以进一步理解这种差异。
例如,如果您将查询更改为SELECT 1
(不需要检索)等情况会发生什么......
...如果您仍然看到与此有所不同,那么我怀疑其他人在说什么......网络,来自其他进程的不可预测的负载等等。顺便说一句,希望你有一个千兆位网络连接到数据库服务器并没有什么慢的。
...如果这样可以消除差异,那么您需要怀疑SQL Server的检索。例如。是在两个不同的查询计划之间摇摆不定?顺便说一下,你说它使用了Clustered Index Seek ......你是说在(假设的)非唯一 GroupId列上有聚集索引吗?
答案 1 :(得分:1)
感知的响应时间将取决于多种因素:网络连接拥塞,SQL Server上的CPU使用率,运行应用程序的计算机上的CPU使用率,HDD I / O等。您不能指望时间准确无误同样的,即使是缓存。
答案 2 :(得分:0)
在数据阅读器MSDN上调用Cancel()
之前,尝试在命令对象上调用Close()
解释为什么这可能会有所帮助。
然后尝试再次运行测试