我遇到了使用C#.Net 4.0中非常大的表的问题。
作为参考,该表有大约1.2亿行。
我甚至不能做像
这样的简单查询SELECT TOP(50) *
FROM TableName
WHERE CreatedOn < '2015-06-01';
从代码中它会超时(默认设置 - 我相信15秒),但在SSMS中它是即时的。
WHERE子句中的列有一个索引。我还尝试将字符串显式地转换为DateTime,并使用DateTime参数而不是文字值。
我尝试了一个不同的查询,按PK过滤(bigint,identity,clustered index)如果我做了类似&#34;其中TableRowID = 1&#34;它可以从代码中正常工作,但如果我尝试使用&#34;&lt;&#34;或&#34;&lt; =&#34;相反,无论转动了多少行,它都会超时(在SSMS中立即返回)。
执行计划非常简单,完全相同。 我尝试过改变ARITHABORT但是没有效果。 我尝试将应用程序连接到我自己的帐户(SSPI)而不是自己的凭据,但没有效果。
我已经研究了这个问题几天了,但我发现的一切都归咎于不同的执行计划。
有没有人知道可能导致此问题的原因是什么?
.Net代码如下所示:
private DataSet ExecuteQuery(string query, string db, List<SqlParameter> parms = null)
{
string connectionString = ConfigurationManager.ConnectionStrings[db].ToString();
SqlConnection con = new SqlConnection(connectionString.Trim());
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
try
{
con.Open();
DataSet ds = new DataSet();
sqlDataAdapter.SelectCommand = new SqlCommand(query, con);
sqlDataAdapter.SelectCommand.CommandType = CommandType.Text;
if (parms != null)
{
foreach (SqlParameter p in parms)
{
sqlDataAdapter.SelectCommand.Parameters.Add(p);
}
}
sqlDataAdapter.Fill(ds);
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
return ds;
}
return null;
}
finally
{
if (sqlDataAdapter != null)
sqlDataAdapter.Dispose();
if (con != null)
con.Dispose();
}
}
我在.Net中收到的错误消息是标准的超时消息:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
答案 0 :(得分:0)
以下是我处理问题时的经验。 非常C#sql代码传递给sql server是 选择TOP(50)* FROM TableName WHERE CreatedOn&lt; '2015年6月1日'
确保标准。如果在SSMS上检索记录需要“即时时间”,则sql语句和数据库优化都可以。
正如其他人所指出的那样,你应该发布你的C#代码,看看会发生什么。可能还有其他问题。这可能是网络吗?可能是web.config吗?你是直接从C#代码打来的吗?你是通过网络服务打电话的吗?
当你说出时间的时候?它是否在您执行查询时超时。您提供的信息非常少。您是否使用第三方例程(例如供应商或贵公司编写)来执行查询?如果可能的话,将断点放在执行sql语句的代码中。我的意思是一直挖掘到本机代码,并放入中断代码。1.2亿条记录。如果数据库在SSMS上运行速度非常快,则看起来已经过优化。我会把看看外面的SQL服务器。
祝你好运答案 1 :(得分:0)
我的第一步是查看您的代码发送到sql server的内容。我首先运行sql profiler。如果你不熟悉它。这是一个如何使用它的链接。
在此之后,您可能需要查看两台服务器之间的网络流量时间。
然后查看IIS并查看它的设置方式。可能是设置错了。
检查错误日志,看看是否还有错误。
答案 2 :(得分:0)
在SSMS中执行代码时,系统会在您的连接上设置一些默认值。具体来说,看看工具 - &gt;选项 - &gt;查询执行 - &gt; Sql Server - &gt;高级(以及ANSI)。当您打开新的查询窗口时,这些语句将代表您执行。
在C#中创建连接对象时,是否设置了相同的选项?如果您未在此处明确设置它们,则您将采用实际SQL Server实例中定义的默认值。在SSMS中,您可以通过查看服务器实例的属性并选择“连接”页面来获取此信息。这显示了默认的连接选项。
您也可以在不使用UI的情况下获取此信息(例如,您可以在使用相同连接字符串的单独应用程序中执行此操作)。 MSSQLTips上的这篇文章应该指导您正确的方向。