如何在 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章