Sql Server响应时间不一致

时间:2014-04-28 17:35:13

标签: c# sql sql-server performance

我有一个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);
}

应用程序截图:
console application screenshot

Wireshark截图:
wireshark screenshot

我按了几次ENTER,响应时间不一致。在我按下的最后6次中,最快的响应是5ms,最慢的响应是29ms。我不确定为什么,似乎应该在服务器中缓存所有响应。

顺便说一下,我已经分析了SQL Server,这些SQL的持续时间都是0.执行计划都是Clustered Index Seek。

3 个答案:

答案 0 :(得分:2)

我建议用几种不同的方式来解决这个问题,以进一步理解这种差异。

例如,如果您将查询更改为SELECT 1(不需要检索)等情况会发生什么......

...如果您仍然看到与此有所不同,那么我怀疑其他人在说什么......网络,来自其他进程的不可预测的负载等等。顺便说一句,希望你有一个千兆位网络连接到数据库服务器并没有什么慢的。

...如果这样可以消除差异,那么您需要怀疑SQL Server的检索。例如。是在两个不同的查询计划之间摇摆不定?顺便说一下,你说它使用了Clustered Index Seek ......你是说在(假设的)非唯一 GroupId列上有聚集索引吗?

答案 1 :(得分:1)

感知的响应时间将取决于多种因素:网络连接拥塞,SQL Server上的CPU使用率,运行应用程序的计算机上的CPU使用率,HDD I / O等。您不能指望时间准确无误同样的,即使是缓存。

答案 2 :(得分:0)

在数据阅读器MSDN上调用Cancel()之前,尝试在命令对象上调用Close()解释为什么这可能会有所帮助。

然后尝试再次运行测试