【问题标题】:Timeout on large sql Select大型 sql 选择超时
【发布时间】:2015-10-29 10:22:59
【问题描述】:

避免在非常大的 sql 选择语句上超时的最佳方法是什么?

List<int> klienter = FundneKlienter.Keys.ToList();

if (klienter.Count > 0)
{
    Dictionary<int, String> klientNavne = new Dictionary<int, string>(klienter.Count);
    String sql = "SELECT [0],[1] FROM [Tabel] WHERE [0] IN " + klienter.ToSqlList();

    using (SqlCommand cmd = new SqlCommand(sql, _connection))
    using (SqlDataReader sr = cmd.ExecuteReader())
        if (sr.HasRows)
            while (sr.Read())
                klientNavne.Add(int.Parse(sr["0"].ToString()), sr["1"].ToString());

这个“klinter”列表可以包含 700 万个 4-5 位长的 ID。

优化此查询的最佳方法是什么?

我在 40.000+ 后超时??我是大 SQL 语句的新手。

如果您需要更多代码来帮助我,请告诉我。

【问题讨论】:

  • 使用字符串连接来构造 SQL 命令不是一个好习惯。 StringBuilder,在循环内产生有效的 sql 命令和 SQL 参数,是避免这种情况的一种可能方法。
  • 即使它与您的问题无关,但老实说(除了在表中使用索引):您确定您真的需要应用程序内存中的所有 700 万个 id 吗?通常,当我在代码中看到需要如此大列表的位置时,我的闹钟会响起,我会问自己是否可以通过使用连接或子查询重做需要该列表的 sql 来减少它,....。不确定您的用例,因此询问您是否确定您确实需要应用程序内列表中的所有这 700 万个条目,因为这通常是多余的。
  • 这是一个很好的观点,你可能有一部分是对的。事情是这样的。我有很多用户控件 20-30 都有一些控件。这些用户控件有一个选择语句 Fx“select top 1000”,然后下一个用户控件有一个选择语句 Fx“select top 2000”,但是第二个用户控件不能选择第一个中的任何内容,依此类推。

标签: c# sql performance select


【解决方案1】:

避免超时问题的一种方法是添加:

SqlCommand.CommandTimeout = 0;

MSDN 说:

值 0 表示没有限制(尝试执行命令将 无限期等待)。

【讨论】:

  • 有没有避免这个错误的好方法?附加信息:内部错误:已达到表达服务限制。请在您的查询中寻找可能复杂的表达式,并尝试简化它们。
  • 也可以在您的应用程序配置文件中添加超时设置,这实际上可以根据情况进行调整。
【解决方案2】:

上面 Rahul 的回答是一个很好的答案...您还可以考虑优化您的查询 - 考虑索引等...

【讨论】:

  • 总之,Rahul 为您提供了一种永远不会出现查询超时的方法。这是一个好主意,从听起来你应该做的事情。因为您遇到了超时,我得出的结论是您的查询运行了很长时间,这就是为什么我建议实施索引等作为加速它的一种手段......
  • 感谢我现在创建了一些索引,现在运行得更好了
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多