更快地编写指定查询的方法

时间:2013-08-20 07:26:38

标签: sql-server performance tsql

所以在我们公司,我们有非常多的文章。 我们有一个自定义的搜索功能来搜索这些文章,这里是一段代码,它生成需要优化的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,所以会影响大型数据库的性能。

提前致谢。

2 个答案:

答案 0 :(得分:2)

首先要确定的是瓶颈来自何处。因此,在SSMS和Include the Actual Execution Plan中运行查询,您将在此处找到...

enter image description here

具体来说,使用这个..

enter image description here

请查看这篇文章Basic Analysis of Execution Plan,它将帮助您识别数据库问题。

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

如果您的代码库看起来没问题,那么请查看任何与UI相关的性能问题,您可能会遇到第三方控件或可能妨碍性能的绑定问题。

另外,考虑一下环境,你在共享服务器上运行吗?是服务器大量使用等?

答案 1 :(得分:0)

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