【发布时间】: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