SQL代码慢而不是SSMS

时间:2015-08-06 18:02:13

标签: c# sql .net sql-server sql-server-2008

我遇到了使用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.

3 个答案:

答案 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。如果你不熟悉它。这是一个如何使用它的链接。

https://www.mssqltips.com/sqlservertip/2040/use-sql-server-profiler-to-trace-database-calls-from-third-party-applications/

在此之后,您可能需要查看两台服务器之间的网络流量时间。

然后查看IIS并查看它的设置方式。可能是设置错了。

检查错误日志,看看是否还有错误。

答案 2 :(得分:0)

在SSMS中执行代码时,系统会在您的连接上设置一些默认值。具体来说,看看工具 - &gt;选项 - &gt;查询执行 - &gt; Sql Server - &gt;高级(以及ANSI)。当您打开新的查询窗口时,这些语句将代表您执行。

在C#中创建连接对象时,是否设置了相同的选项?如果您未在此处明确设置它们,则您将采用实际SQL Server实例中定义的默认值。在SSMS中,您可以通过查看服务器实例的属性并选择“连接”页面来获取此信息。这显示了默认的连接选项。

您也可以在不使用UI的情况下获取此信息(例如,您可以在使用相同连接字符串的单独应用程序中执行此操作)。 MSSQLTips上的这篇文章应该指导您正确的方向。