【问题标题】:Faster way to write specified query编写指定查询的更快方法
【发布时间】:2013-08-20 07:26:37
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 虽然查询执行代码是在VB.NET中,这真的是VB.NET的问题吗?
  • 我们在这里讨论多少张表?这似乎是属性拆分的经典案例 - 您有多个具有相同/相似结构的表,并且数据的附加部分已编码到表名中,而不是放置在(易于查询的)列中的真实数据。
  • @Damien_The_Unbeliever,这取决于,这可以超过 10 张桌子。你会如何让这更容易?表格无法合并,因为它们代表不同类型的文章。 (具有不同的属性,所以“类型”字段也是不可能的)
  • 很可能,正确的关系设计将涉及使用类型列将它们的公共属性合并到一个公共表中,以针对它们的特定属性重定向到特定表。

标签: sql-server performance tsql


【解决方案1】:

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

具体来说,使用这个..

.

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2010-11-20
      相关资源
      最近更新 更多