我最近工作的一个项目需要检查我们的 SQL 查询的时序,并在调试模式下将它们输出到调试侦听器。通过这种方式,我们可以评估 SQL 查询的时间以及它们执行的时间,以及调试我们的网站代码。
我通过将 SQL 查询集中到我们使用的 3 种 SQL 方法的包装方法中来做到这一点:
他们确实使用了 Stopwatch 类,但也有将查询转换为 SQL 语句的代码,类似于 SQL Server Profiler 中看到的代码。
每种方法都类似于以下内容:
protected static object ExecuteScalar(SqlCommand comm, SqlParameter[] sqlParameters)
{
Stopwatch st = new Stopwatch();
bool errorDetected = false;
try
{
comm.Parameters.Add(sqlParameters);
using(comm)
{
st.Start();
object returnValue = comm.ExecuteScalar();
st.Stop();
return returnValue;
}
}
catch(Exception)
{
errorDetected = true;
st.Stop();
throw;
}
finally
{
string output = GetSqlStringForParameters(sqlParameters,st.Elapsed,QueryType.Scalar);
if(errorDetected)
{
Debug.WriteLine("/*SQL (Errored)*/" + output,"DataAccess.SqlAdapter.ExecuteScalar");
}
else
{
Debug.WriteLine("/*SQL*/" + output,"DataAccess.SqlAdapter.ExecuteScalar");
}
}
}
这将在 DebugView.exe 中输出我们的 SQL 语句,如下所示:
/*SQL*/ exec spsGetOrder @OrderNumber='234567' -- Rows returned = 1 ; 1 params |--> completed NonQuery in 0.0016144 seconds.
这样做的美妙之处在于,虽然这些语句存在瓶颈,但我们可以将查询直接粘贴到 SQL 分析器中并获取查询的输出。这也意味着如果你有查看日志文件的工具,你可以使用正则表达式来监控所花费的时间在某个范围内。
因此,如果您想查找耗时超过 0.5 秒的查询,您可以搜索该术语:
"in 0.[5-9]\d+" <-- 一切大于 0.5 秒或 "in [1-9].\d+" <-- 一切大于 1 秒
这帮助我们极大地集中精力。它还可以帮助我们确定问题是否与数据库相关,或者如上所述,是 ASP.NET 问题。
最后,还有一个名为Fiddler的工具,它还可以帮助您在页面进入您的计算机时对其进行诊断。这会为您提供文件大小、对图像/css 的引用、下载时间等信息。这对于诊断 ViewState 大小问题也非常有用。
我希望这有帮助