【问题标题】:t sql union vs join order (efficiency) [closed]t sql union vs join order(效率)[关闭]
【发布时间】:2012-10-30 18:04:25
【问题描述】:

我有一个比较简单的问题。

我有数据集 A 和数据集 B,两者结构相同。

最终的结果将是数据集 A 和数据集 B 的联合,我们称之为数据集 C。

但在最终版本之前,需要通过加入数据集 X 来过滤最终数据集。

问题是我应该在数据集 X 上加入数据集 A,在数据集 X 上加入数据集 B,然后将所有 A 和 B 合并,还是应该将所有 A 和 B 合并到 C 中,然后在 X 上加入 C。

什么是更快、更节省内存等?

提前致谢!

【问题讨论】:

  • 你是不是刚试过,比较了SSMS中的执行时间和查询计划?
  • 为什么您认为这里的任何人都比您更适合告诉您,对于您的查询、针对您的数据、在您的硬件上,哪个更有效?
  • 重点不是在此特定查询中对于此特定服务器上的此特定数据集更有效的方法,我是在询问就 sql 处理方式而言,对于大型数据集而言,一个订单是否更有效代码。如果没有通用的答案,并且在使用类似大小的数据集时,它会根据具体情况而变慢或变快,而不是 sql server 的编码方式有问题。
  • If there is no universal answer...than (sic) there is something wrong with the way sql server is coded 我认为您对数据库系统的理解有问题。或者特别是 SQL Server。
  • 如果 X 是一个特殊事件表,对 A 和 B 有良好的索引(大表),并且具有良好的统计信息,SQL Server 将首先执行 JOIN 即使你表达了UNION ALL 在派生表中。如果您有两个具有良好交集的小表 A 和 B,以及一个较大的 X 表,则 UNION/SORT 将在 JOIN 之前发生,再次给出良好的统计信息。除了这些极端情况,任何事情都会发生。

标签: sql sql-server


【解决方案1】:

这取决于很多事情,从您的问题中无法说出:索引、统计、INNER 或 OUTER JOIN、数据类型。您必须了解更多,即使如此,您也确实需要比较执行计划。

因为我不喜欢重复自己,出于维护原因,我可能会在 UNION 之外进行 JOIN,但如果我必须打赌,我可能会打赌,首先加入会胜过它 - 特别是如果加入削减大幅减少行数。

【讨论】:

  • 都是内连接。他们不会总是大幅减少行数。我刚刚运行了几个测试场景,结果如下:在每个数据集上执行连接,然后在平均大约 26 秒后将所有数据联合起来。首先执行联合,然后加入结果平均为 21.5 秒。这是大约 65k 行的结果。对于这么少的行,这似乎是一个显着的差异。
  • @jz3 我得看更多关于数据、代码和执行计划的信息才能说更多。
【解决方案2】:

我的直觉是将两者都加入 x 然后合并结果。这样 sql server 优化器就有更好的机会提供最佳的查询计划,但这可能是你编写两者的情况,检查执行计划和时间以真正看到差异。

【讨论】:

    【解决方案3】:

    我真的很想看看两者的执行计划,看看什么需要更少的时间/资源。

    Here is a great starter video 开始对 SQL 授权进行性能调整。一个真正从未得到足够关注的话题。

    监控优化演变过程中的执行计划是一项很棒的技术,因为它确实深入人心,可以向您展示进一步的索引和其他调整技术是否以及如何在您的执行中获得回报。

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 1970-01-01
      • 2021-05-10
      • 2010-11-03
      • 2017-08-19
      • 2014-09-26
      相关资源
      最近更新 更多