当前位置: 首页 > 面试题库 >

从C#运行时,SQL查询超时,在SQL Server Management Studio中快速

濮阳默
2023-03-14
问题内容

我有一个使用下面列出的代码执行SQL查询的C#程序。我一直在使用此代码一段时间,直到前一天都没有问题。

我正在将一个查询字符串传递给SQL,该查询字符串包括一个字符串列表,这些字符串是股票标识符。几天前,我运行了该查询,但查询超时了,如果允许的话,它将运行一个多小时。我花了几天的时间来调试它。在我最初的查询中,大约有900个标识符。

我已经尝试过改变所有我能想到的东西,但是却得到了我无法解释的结果。

例如:

  1. 该查询适用于一个清单的股票,但不适用于相同长度的另一清单(在字符串数和总长度方面)

  2. 它适用于一个列表,但不能以相反的顺序与同一列表一起使用

  3. 一个列表,如果恰好有900个标识符,则有效,但如果有899或901,则不起作用,而且我可以包括或排除不同的标识符并获得相同的结果,因此使用其中一个标识符并不是一件很时髦的事情。

在每种情况下,我都捕获了程序传递的查询字符串并将其复制到SQL Server Management Studio中,并且在每种情况下,查询都在1秒钟内运行。

我已经在这个论坛和其他论坛上阅读了有关在SQL Server Management
Studio中工作的查询的所有内容,但是从程序运行时却超时了,但这似乎有所不同,因为我可以找到失败的情况以及无法解决的类似情况。工作。

我希望您能提出建议,以期了解可能发生的情况。

using (SqlConnection conn = new SqlConnection(_connectString))
{
    conn.Open();

    using (SqlCommand cmd = new SqlCommand(queryString, conn))
    {
        cmd.Parameters.Clear();
        cmd.CommandTimeout = _timeout;

        SqlParameter param;

        if (parms != null)
        {
            foreach (string parm in parms.Keys)
            {
                param = cmd.Parameters.AddWithValue(parm, parms[parm]);
            }
        }

        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            QueryResult record = new QueryResult();
            record.Fields = new List<object>();

            for (int i = 0; i < returnColumns; ++i)
            {
                object value = reader.GetValue(i);

                if (value == DBNull.Value)
                    record.Fields.Add(null);
                else
                    record.Fields.Add(value);
            }

            result.Add(record);
        }

        reader.Close();
    }

    conn.Close();
}

这是我的查询。在此版本中,我包括65种股票,但它不起作用(<= 64起作用)。

select
    distinct a.Cusip
,   d.Value_ / f.CumAdjFactor as split_adj_val

from qai.prc.PrcScChg a

join qai.dbo.SecMapX b
    on a.Code = b.venCode
    and b.VenType = 1
    and b.exchange = 1
    and b.Rank = (select Min(Rank) from qai.dbo.SecMapX where VenCode = a.Code and VenType = 1 and Exchange = 1)

join qai.dbo.SecMapX b2
    on b2.seccode = b.seccode
    and b2.ventype = 40
    and b2.exchange = 1
    and b2.Rank = (select Min(Rank) from qai.dbo.SecMapX where SecCode = b.SecCode and VenType = 40 and Exchange = 1)

join qai.dbo.SecMapX b3
    on b3.seccode = b.seccode
    and b3.ventype = 33
    and b3.exchange = 1
    and b3.Rank = (select Min(Rank) from qai.dbo.SecMapX where SecCode = b.SecCode and VenType = 33 and Exchange = 1)

join qai.dbo.DXLSecInfo c
    on b2.VenCode = c.Code

join qai.dbo.DXLAmData d
    on c.Code = d.Code
    and d.Date_ = @Date
    and d.Item = 6

left JOIN qai.dbo.DS2Adj f 
    ON f.InfoCode = b3.VenCode
    AND f.AdjType = 2
    and f.AdjDate <= @Date
    and ( f.EndAdjDate >= @Date or f.EndAdjDate is null )

where 
    a.cusip in ('00101J10', '00105510', '00120410', '00130H10', '00206R10',
    '00282410', '00287Y10', '00289620', '00724F10', '00817Y10', '00846U10',
    '00915810', '00936310', '00971T10', '01381710', '01535110', '01741R10',
    '01849010', '02000210', '02144110', '02209S10', '02313510', '02360810',
    '02553710', '02581610', '02687478', '03027X10', '03073E10', '03076C10',
    '03110010', '03116210', '03209510', '03251110', '03265410', '03741110',
    '03748R10', '03783310', '03822210', '03948310', '04621X10', '05276910',
    '05301510', '05329W10', '05333210', '05348410', '05361110', '05430310',
    '05493710', '05722410', '05849810', '06050510', '06405810', '06738310',
    '07181310', '07373010', '07588710', '07589610', '08143710', '08467070',
    '08651610', '09062X10', '09247X10', '09367110', '09702310', '09972410')

问题答案:

按优先顺序看三件事:

  1. 避免使用AddWithValue()function,因为当ADO.Net猜测列类型错误时,这可能会带来灾难性的性能影响。做您必须能够为每个参数设置显式数据库类型的操作
  2. 查看OPTION RECOMPILE。
  3. 研究未知的优化。仅在其他失败之后再执行此操作。


 类似资料:
  • 问题内容: 我正在使用C#在SQL数据库中进行一些繁重的工作。 我不断收到以下超时异常: 超时时间已到。在操作完成之前超时或服务器没有响应。该语句已终止。 我运行了大量查询(超过10万个查询),而导致该异常的并不是任何一个特定的查询-有时我会设法无一例外地完成所有这些查询。 一些例外来自作为较大事务的一部分运行的查询,某些例外来自独立运行的查询。 当我直接在SQL Server Managemen

  • 问题内容: 然而,从上述线程中摘录的一个重要观点是: Querydsl和jOOQ似乎是最流行和最成熟的选择,但是需要注意的一件事: 两者都依赖于代码生成的概念, 即为数据库表和字段生成元类。这有助于建立一个漂亮,干净的DSL,但是 在尝试为仅在运行时才知道的数据库创建查询时会遇到问题 。 除了仅使用纯JDBC +字符串串联外,还有什么方法可以在运行时创建查询吗? 我正在寻找的是一个Web应用程序,

  • 问题内容: 我命中了要通过自定义开发层进行Solr的查询,而我在该层中超时的一些查询仍在solr实例中。solr中是否有一个可用于使特定查询超时的参数 问题答案: 如Solr中所述,客户端断开连接后查询继续吗?并写在Solr常见问题解答中 在内部,Solr不会使任何请求超时-它使更新和查询都需要花费很长时间才能完全处理。 但是在FAQ的同一位置 但是,用于运行Solr的servlet容器可能会对所

  • 问题内容: 我已经在mysql上创建了HEAP(ram)表,以实现更快的查询。但是在mysql服务器重启后,我的堆表中的数据没有被加载。 我的正常的表名: 产品 与ID,PRODUCT_NAME,地位的MyISAM id = >整数和auto_increment,主键 product_name = > var_char和键(索引) 状态= >布尔值 实际查询: 我想提高速度,所以我创建了具有相同结

  • 问题内容: 说我长时间运行更新查询 some_table中的modification_time的值是什么?它们是相同还是不同(例如,执行查询花了2天的时间)。 如果它们不同,如​​何编写此查询以使它们都相同? 问题答案: 它们都是一样的,因为NOW()在查询开始时被锁定了。 答案太短了吗? 好的,更多信息有关NOW()的MySQL参考 NOW()返回一个 恒定时间 ,该时间指示该语句 开始执行的时

  • 问题内容: 我收到此错误: 超时时间已到。在操作完成之前超时时间已过,或者服务器没有响应。 我知道那里已经有帮助解决此问题的指南,但它们对我不起作用。我缺少什么,或者应该在哪里将代码添加到C#程序中的这些SQL语句中: 我在此行收到超时错误: 问题答案: