【问题标题】:SQL performance GROUP BY vs UNIONSQL 性能 GROUP BY 与 UNION
【发布时间】:2015-03-22 23:09:29
【问题描述】:

我在使用 GROUP BY 与 UNION 时表现不佳。见下文

使用 GROUP BY,~ 17 秒

select b.BookTypeKey, count(b.BookKey) 
from Books b
where contains(b.BookTitle, @SearchTerm)
group by b.BookTypeKey

使用 UNION,~ 1-2 秒

select '1' as BookTypeKey, count(b.BookKey)
from Books b
where contains(b.BookTitle, @SearchTerm) and b.BookTypeKey = 1

union

select '2' as BookTypeKey, count(b.BookKey)
from Books b
where contains(b.BookTitle, @SearchTerm) and b.BookTypeKey = 2

union

select '3' as BookTypeKey, count(b.BookKey)
from Books b
where contains(b.BookTitle, @SearchTerm) and b.BookTypeKey = 3

有什么想法吗?理想情况下,我想这样做而不必使用三个单独的 UNION 语句。仅供参考,只有三种“BookTypes”(1,2 和 3)

【问题讨论】:

  • 看看执行计划,看看有什么区别?
  • 似乎如果您以一种方式获得更好的性能,那么您会使用这种方式。有时您需要更复杂的代码才能获得更好的性能。除此之外,不确定我们能否在不了解您的整个架构或执行计划的情况下提供具体信息。
  • @Jeremy 如何查看执行计划?我正在使用 SQL Management Studio 2008
  • 您是否使用多次运行对这些进行计时,以确保差异不是缓存差异?
  • 将鼠标悬停在大红色感叹号右侧的按钮上,找到带有“包括实际执行计划”的工具提示的按钮,然后再次运行您的查询。您将在结果右侧看到另一个选项卡。

标签: sql sql-server performance tsql


【解决方案1】:

评论太长了。你说只有三种书,你确定吗?此查询返回什么:

select b.BookTypeKey, count(b.BookKey) 
from Books b
group by b.BookTypeKey;

NULL 将是一个非常重要的考虑因素。我希望contains() 会对性能产生重大影响。但是,两个版本的查询都会调用相同次数的contains()——除非BookTypeKey 的值超过三个。否则contains()group by之间可能会有一些奇怪的交互。

另外,union all 在第二个查询中的性能应该稍好一些。

【讨论】:

  • 是的,它仍然只返回三个值(1,2 和 3),没有 NULL 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2023-03-08
  • 2022-01-15
相关资源
最近更新 更多