如何在 C# 中计时执行 SQL 查询?

Posted

技术标签:

【中文标题】如何在 C# 中计时执行 SQL 查询?【英文标题】:How do I time the execution of an SQL Query in C#? 【发布时间】:2018-09-18 20:20:30 【问题描述】:

我正在尝试使用 c# 找出我的 SQL Server 查询的执行时间。我认为计时器会起作用;但是我是 c# 的新手,并且一直无法弄清楚。我在这个网站上搜索了几个问题,在其他网站上试图找出如何计时执行我的查询。

这是我的代码:

using System;
using System.Data.SqlClient;

class Program

    static void Main()
    
        Console.WriteLine("Executing query...");
        string customerID = "ID_HERE";
        using (SqlConnection connection = new SqlConnection("CONNECTION_STRING"))
        
            connection.Open();

            using (SqlCommand command = new SqlCommand(
                "SELECT col0, col1, col2, col3, col4, col5, col6, col7, col8, col9 FROM Table_name WHERE col1 LIKE @ID", connection))
            

                command.Parameters.Add(new SqlParameter("ID", customerID));

                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                
                    int col0 = reader.GetInt32(0);
                    int col1 = reader.GetInt32(1);
                    string col2 = reader.GetString(2);
                    string col3 = reader.GetString(3);
                    int col4 = reader.GetInt32(4);
                    int col5 = reader.GetInt32(5);
                    short col6 = reader.GetInt16(6);
                    string col7 = reader.GetString(7);
                    string col8 = reader.GetString(8);
                    int col9 = reader.GetInt32(9);
                    Console.WriteLine("col0 = 0, col1 = 1, col2 = 2, col3 = 3, col4 = 4, col5 = 5, col6 = 6, col7 = 7, col8 = 8, col9 = 9",
                        col0,
                        col1,
                        col2,
                        col3,
                        col4,
                        col5,
                        col6,
                        col7,
                        col8,
                        col9
                        );
                
            
        
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    


我不确定如何为此添加一个计时器,该计时器只计算查询的执行时间,甚至不知道将它放在哪里。我尝试过寻找其他有关它的帖子,但我发现的帖子都与此类似;我的搜索也可能非常糟糕。任何形式的帮助将不胜感激,如果您需要更多信息,请告诉我。为了安全起见,我重命名了一些东西,但这就是代码的其他方式。注意:我将其用于测试目的,而不是用于生产,因此只有少数人会真正看到它,但这是必要的。

【问题讨论】:

如果你想计算实际查询的时间,你应该在 sql server 上进行。将您的查询移动到存储过程,并在执行查询之前和之后捕获当前系统时间。 【参考方案1】:

你要找的是StopWatch,这是一个例子:

var watch = System.Diagnostics.Stopwatch.StartNew();
// Run your query
watch.Stop();
//This is the time it took in miliseconds
var elapsedTime = watch.ElapsedMilliseconds;

检查 this question 了解为什么不应该使用 DateTime。

【讨论】:

【参考方案2】:

SQL 查询从SqlCommand.ExecuteReader() 开始执行,并在SqlDataReader.Read() 返回 false 后执行完毕。请注意,如果 SQL Server 的网络速度较慢或有大量结果,这将无法准确衡量在 SQL Server 上等待所花费的时间。

所以

using System;
using System.Data.SqlClient;
using System.Diagnostics;

class Program

    static void Main()
    
        Console.WriteLine("Executing query...");
        string customerID = "ID_HERE";
        using (SqlConnection connection = new SqlConnection("CONNECTION_STRING"))
        
            connection.Open();

            using (SqlCommand command = new SqlCommand(
                "SELECT col0, col1, col2, col3, col4, col5, col6, col7, col8, col9 FROM Table_name WHERE col1 LIKE @ID", connection))
            

                command.Parameters.Add(new SqlParameter("ID", customerID));
                var sw = new Stopwatch();

                sw.Start();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                
                    int col0 = reader.GetInt32(0);
                    int col1 = reader.GetInt32(1);
                    string col2 = reader.GetString(2);
                    string col3 = reader.GetString(3);
                    int col4 = reader.GetInt32(4);
                    int col5 = reader.GetInt32(5);
                    short col6 = reader.GetInt16(6);
                    string col7 = reader.GetString(7);
                    string col8 = reader.GetString(8);
                    int col9 = reader.GetInt32(9);
                    Console.WriteLine("col0 = 0, col1 = 1, col2 = 2, col3 = 3, col4 = 4, col5 = 5, col6 = 6, col7 = 7, col8 = 8, col9 = 9",
                        col0,
                        col1,
                        col2,
                        col3,
                        col4,
                        col5,
                        col6,
                        col7,
                        col8,
                        col9
                        );
                
                var elapsed = sw.Elapsed;

                Console.WriteLine($"Query Executed and Results Returned in elapsed.Secondssec");
            
        
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    


【讨论】:

我认为这很有帮助,但时间也将包括 Console.WriteLine 运行的时间。相对于将文本发送到屏幕所花费的时间,实际查询可能会更快。【参考方案3】:

我猜如果您在 SQL 执行之前和之后获取服务器时间 (DateTime.Now) 并找到可以为您提供经过时间的差异。

【讨论】:

不,DateTime 类型没有很好的分辨率。秒表会更合适 秒表正是我想要的。我是 c# 的新手,所以直到现在我才知道,谢谢!【参考方案4】:

我也想完成同样的事情。我见过StopWatch(),但一直无法让它工作。所以我只是操纵了我自己的:

TimeSpan ts = DateTime.Now.TimeOfDay;
Debug.Print("\n\nProcess Started---- " + processName + " ----  " + ts + "\n\n");
/*
 * code here
 */
TimeSpan fts = DateTime.Now.TimeOfDay;
Debug.Print("\n\nProcess Ended---- " + processName + " ----  " + fts + "\n");
Debug.Print("Time Elapsed----  " + (fts - ts) + " \n\n");

它可能不是最快或最干净的。但它告诉我我想知道什么。您还需要using System.Diagnostics; 语句才能打印到debug window

注意:如果您能够让StopWatch() 为您工作,那么我绝对会建议您这样做。这只是我的代码解决方案。

【讨论】:

秒表是我需要做的。在看到这里提到它之后,由于我对 c# 还很陌生,所以我做了更多的研究。这个网站最终帮助我让它工作:dotnetperls.com/stopwatch我希望这也能帮助你!【参考方案5】:
DECLARE @Time1 DATETIME

DECLARE @Time2 DATETIME

SET     @Time1 = GETDATE()

-- Insert query here

SET     @Time2 = GETDATE()

SELECT  DATE DIFF(MILLISECOND,@Time1,@Time2) AS Elapsed_MS

此代码允许您在 sql 查询中显示特定代码段的确切执行时间。将您想要获取执行时间的代码放在以下脚本的中心。具体时间会在结果中显示。

【讨论】:

以上是关于如何在 C# 中计时执行 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询

如何停止在 C# 类中运行的计时器

如何通过单击按钮 [C#] 执行 2 个 sql 查询

如何从 C# 测试 sql 查询执行? [复制]

在 C# 中发送 http 请求时,如何设置计时器或等待?

如何在 C# 中创建动态参数化 SQL 查询字符串