【问题标题】:SQL Server inner joinSQL Server 内连接
【发布时间】:2013-10-14 08:38:42
【问题描述】:

内连接多表时如何选择主表?

A) 我应该根据列数/行数来选择主表吗(例如大主表作为主表还是保留较大的表作为连接表)?

B) 如果我选择包含我在 where 条件中使用的列的表作为主表,会有任何性能优势吗?

例如,假设有 2 张桌子。表 1 和表 2。下面给出的两种解决方案之间是否会有任何性能差异

解决方案 1:

select t1.empid , t1.name , t1.dept , t2.add , t2.city , t2.country
from Table1 t1
inner join Table2 t2 on t2.empid = t1.empid
where t1.year = 2010

解决方案 2:

select t1.empid , t1.name , t1.dept , t2.add , t2.city , t2.country
from Table2 t2
inner join Table1 t1 on t1.empid = t2.empid 
where t1.year = 2010

【问题讨论】:

  • 您可以检查执行计划,但如果有差异,我会感到非常惊讶。
  • 我认为这不会有什么不同。
  • 感谢 HLGEM 和 Nilesh 的 cmets。如果我选择大表作为主表,会有什么不同吗?内部连接是否有任何基本的经验法则可以提高效率?
  • 我尝试了上面的实验(MSSQL),并没有看到执行计划有任何变化。但是,我观察到执行时间的变化。当您在查询中首先放置具有大量记录的表时,执行需要更多时间。使用“where”子句时,执行计划和执行时间都没有变化。

标签: sql-server sql-server-2008 inner-join


【解决方案1】:

没有区别。 SQL Server 将根据表统计信息选择“主”表和连接类型。

示例: 表 1 包含 5 行(只有 2010 年的行)。表 2 包含 10000 行。 SQL Server 将生成嵌套循环连接,其中 Table1 作为外部输入,Table2 作为内部输入,以获得 1 运行超过 1000 行。它绝对不会在 1 行上产生 10000 个循环。

您仍然可以获得上述语句的不同执行计划,但前提是 SQL Server 认为该计划应该是微不足道的并跳过优化阶段(例如,因为表几乎是空的)。

【讨论】:

    【解决方案2】:

    主表应该是您使用最多列的表,因此如果您使用的 table1 有 4 列,并且需要从 table2 中取出一列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多