【问题标题】:Performance issue with SQL server due to sql query由于 sql 查询导致的 SQL Server 性能问题
【发布时间】:2013-04-01 11:07:00
【问题描述】:

需要一些帮助来解决这个错误:

查询处理器用尽了内部资源,无法 生成查询计划。这是一个罕见的事件,只预计 极其复杂的查询或引用非常大的查询 表或分区的数量。请简化查询。如果你 相信您错误地收到了此消息,请联系客户 支持服务了解更多信息。

SQL 查询:(我只是输入其中一个查询。我运行了 9 个这样的查询)

var query1 = from article in _db.Articles
             from scl in article.Scls
             where article.publishDate < DateTime.Now
                && article.removalDate > DateTime.Now
                && article.finished == true
                && article.flagged== true
                && listOfScl.Contains(scl.id)
             select article;

var query2 = from article in _db.Articles
             from com in article.Coms
             where article.publishDate < DateTime.Now
                && article.removalDate > DateTime.Now
                && article.finished == true
                && article.flagged== true
                && listOfCom.Contains(com.id)
             select article;

query = (query1.Union(query2)).Distinct();

不知道查询它工作正常但在 SQL Server 上出现一些性能问题。

我需要一些帮助来避免此类错误并在不使用 UNION 的情况下重新编写此 SQL 查询。

提前致谢。

【问题讨论】:

  • 这是 .NET LINQ to SQL 吗?绝对不是正常的 SQL 语法。看来您的主要问题是使用 ORM 工具,但不知道您正在使用 ORM 工具...
  • 是的,使用 .NET LINQ to SQL
  • 为了帮助我们提高 SQL 性能,您需要提取数据库上实际运行的查询,以便我们了解发生了什么。
  • @N West - 很长的查询。要我把它放在这里吗?

标签: sql sql-server linq


【解决方案1】:

另请注意,默认情况下 LINQ 执行 UNION,这将消除重复,因此不需要 Distinct,这可能会提高性能。

“在不使用 UNION 的情况下重新编写此 SQL 查询。”。这是怎么回事?

var query1 = from article in _db.Articles
             from scl in article.Scls
             where article.publishDate < DateTime.Now
                && article.removalDate > DateTime.Now
                && article.finished == true
                && article.flagged== true
                && ( 
                     listOfScl.Contains(scl.id)
                     || listOfCom.Contains(com.id) 
                   )
             select article;

你可以试试这个的表现,这样你就不需要一个独特的。但它会涉及一个子查询,所以很难说没有测试什么会表现得更好:

var query1 = _db.Articles.Where(article => article.publishDate < DateTime.Now
                && article.removalDate > DateTime.Now
                && article.finished == true
                && article.flagged== true
                && ( article.Scls.Any(s=> listOfScl.Contains(s.id))
                     || article.Coms.Any(c=> listOfCom.Contains(c.id))
                   )
                );

【讨论】:

  • 我试过这个查询,它没有消除重复的文章。部分文章获得2次。
  • 听起来多个 Scsls 可以引用一篇文章,所以在这种情况下你仍然需要 Distinct。抱歉,由于使用了 Union,我假设您正在做不同的事情,并且没有考虑一对多的关系。
  • @user2263417 添加了另一个想法,我不确定它是否会编译/工作,但您可以尝试一下。
  • @user2263417 让我知道它是否有效,我很好奇。抱歉,我无法即时设置测试。
  • 谢谢 Aaron...我明天试试这个并告诉你。
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
相关资源
最近更新 更多