所以在我们公司,我们有非常多的文章。 我们有一个自定义的搜索功能来搜索这些文章,这里是一段代码,它生成需要优化的searchquery的一部分。
dtModif = dalDocType.FetchByAnyIdentifier(False, "+")
sb.Append("(SELECT ( ")
For Each row In dtModif.Rows
sb.Append("ISNULL((SELECT -SUM(amount) ")
sb.Append("FROM Sales." & row("TableName") & "Detail ")
sb.Append("WHERE ArticleID = articles.Article.ArticleId ")
sb.Append("AND DATEADD(Year,-1,GETDATE()) < Timestamp ")
sb.Append("),0) ")
sb.Append("+ ")
Next
dtModif = dalDocType.FetchByAnyIdentifier(False, "-")
For Each row In dtModif.Rows
sb.Append("ISNULL((SELECT +SUM(amount) ")
sb.Append("FROM Sales." & row("TableName") & "Detail ")
sb.Append("WHERE ArticleID = articles.Article.ArticleId ")
sb.Append("AND DATEADD(Year,-1,GETDATE()) < Timestamp ")
sb.Append("),0)")
sb.Append("+ ")
Next
sb = sb.Remove(sb.Length - 2, 2)
sb.Append(") )")
我得到每个文章,其中stockmodifier为正(因此更多卖出然后返回),并且我添加了stockmodifier为负的所有文章的负数。通过这种方式,我可以获得该文章销售的次数。 (可以是否定的。)
我现在想知道,有没有更好的方法来构建这个查询? 因为这基本上是多个SELECTS的SELECT,所以会影响大型数据库的性能。
提前致谢。
答案 0 :(得分:2)
首先要确定的是瓶颈来自何处。因此,在SSMS和Include the Actual Execution Plan
中运行查询,您将在此处找到...
具体来说,使用这个..
请查看这篇文章Basic Analysis of Execution Plan,它将帮助您识别数据库问题。
完成此操作后,如果您仍遇到问题,请使用Antz Profiler之类的工具来分析应用程序。这将识别代码中的问题,并帮助精确定位大量使用或需要重构的代码行。
如果您的代码库看起来没问题,那么请查看任何与UI相关的性能问题,您可能会遇到第三方控件或可能妨碍性能的绑定问题。
另外,考虑一下环境,你在共享服务器上运行吗?是服务器大量使用等?
答案 1 :(得分:0)
我要做的第一件事就是接受查询并检查其执行计划,以查看性能下降最多的地方。另外,请确保在连接的列和where子句的列上有索引。