0

所以在我们公司,我们有大量的文章。我们有一个自定义的搜索功能可以在这些文章中进行搜索,这里有一段代码可以生成搜索查询中需要优化的部分。

        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,所以会影响大型数据库的性能。

提前致谢。

4

2 回答 2

2

首先要确定瓶颈来自哪里。因此,在 SSMS 和 中运行查询Include the Actual Execution Plan,您可以在此处找到...

在此处输入图像描述

具体来说,使用这个..

在此处输入图像描述.

看看这篇文章,执行计划的基本分析,它将帮助您识别数据库问题。

完成此操作后,如果您仍然遇到问题,请使用Antz Profiler之类的工具来分析应用程序。这将识别代码中的问题,并帮助查明大量使用或需要重构的代码行。

如果您的代码库看起来不错,那么请查看任何与 UI 相关的性能问题,您可能有 3rd 方控件或可能妨碍性能的绑定问题。

另外,考虑环境,您是否在共享服务器上运行?服务器是否大量使用等?

于 2013-08-20T11:52:56.287 回答
0

我要做的第一件事是获取查询并检查其执行计划,以查看性能下降最多的地方。此外,请确保您在执行连接和 where 子句的列上有索引。

于 2013-08-20T11:39:54.933 回答