gpt4 book ai didi

c# - SqlCommand 超时,即使在 SQL Studio 中相同的查询很快

转载 作者:太空狗 更新时间:2023-10-30 01:05:54 25 4
gpt4 key购买 nike

我有一个我认为是从我的小型日志处理应用程序执行的简单查询。此方法的目的是简单地从日志表中获取最高日期值:

private DateTime GetLastEntryDate(string serverName, string siteName)
{
DateTime dt = DateTime.MinValue;
using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LogParserDB"].ConnectionString))
{
con.Open();
using (var cmd = new SqlCommand("SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site", con))
{
cmd.CommandTimeout = 120;
cmd.Parameters.AddWithValue("Host", serverName);
cmd.Parameters.AddWithValue("Site", siteName);
var result = cmd.ExecuteScalar();
if (result != DBNull.Value)
{
dt = (DateTime)result;
}
}
}
return dt;
}

表上有一些索引,但我不确定这是否相关,因为我遇到的问题是当我运行这段代码时,它在 ExecuteScalar< 上 2 分钟后抛出超时 行。

如果我将该查询复制并粘贴到具有相同参数的 SSMS 中,它会在 00:00:04 甚至 00:00:00 完成(如果我刚刚更新了统计信息)。

SELECT MAX(date) FROM iislogs WHERE host='servername' AND site='W3SVC1'

我已经检查了阻塞,但我看不到任何类似的东西 - 该数据库被这个应用程序访问,它不是多线程或类似的东西。


更新:有趣的是,当我运行 Profiler 捕获的准确查询时,它在 SSMS 中也需要很长时间:

exec sp_executesql N'SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site',N'@Host nvarchar(13),@Site nvarchar(6)',@Host=N'servername',@Site=N'W3SVC1'

实际的列分别是 varchar(50)varchar(10)

最佳答案

您在 SSMS 中执行的查询

SELECT MAX(date)
FROM iislogs
WHERE host = 'servername'
AND site = 'W3SVC1'

与您的应用程序执行的不同。

EXEC sp_executesql
N'SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site',
N'@Host nvarchar(13),@Site nvarchar(6)',
@Host=N'servername',
@Site=N'W3SVC1'

第一个有 varchar 字符串文字。第二个有 nvarchar 参数。您的列数据类型实际上是 varchar

nvarcharhigher datatype precedencevarchar 所以你强制对列进行隐式转换。这将使该列上的任何索引变得无用。

将应用程序中的参数数据类型更改为varchar

关于c# - SqlCommand 超时,即使在 SQL Studio 中相同的查询很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com