【问题标题】:SQL Server performance - Subselect or Inner Join?SQL Server 性能 - 子选择或内部联接?
【发布时间】:2011-08-15 10:53:03
【问题描述】:

我一直在思考这两个语句中哪一个可能具有更高的性能(以及为什么):

select * from formelement 
where formid = (select id from form where name = 'Test')

select * 
from formelement fe 
inner join form f on fe.formid = f.id 
where f.name = 'Test'

一个表单包含多个表单元素,一个表单元素始终是一个表单的一部分。

谢谢,

丹尼斯

【问题讨论】:

  • 同时运行它们并比较执行计划...
  • 好主意,老实说我不知道​​这个功能存在。但是,虽然这回答了究竟什么需要性能的问题,但它并没有真正告诉我为什么会这样。
  • 我删除了我的答案 :) 对于执行计划,他们会告诉你原因。你会看到操作是否不同,执行的操作类型会给你推理。

标签: sql-server inner-join subquery


【解决方案1】:

查看执行计划,如果将过滤添加到联接中,很可能会相同,即联接将返回两个表中的所有内容,而 in 不会

实际上我更喜欢EXISTS 而不是这两个

select * from formelement  fe
where exists (select 1 from form f 
                 where f.name='Test' 
                 and fe.formid =f.id)

【讨论】:

  • IN 也将等同于存在,正确(执行计划明智)?
  • 是的,应该是一样的,我更喜欢exists,因为你不必担心NULLS或者如果你输入错误的列名,如果列名存在于表单元素表。此处示例:forum.lessthandot.com/viewtopic.php?f=17&t=14123
【解决方案2】:

性能取决于 SQL Server 引擎选择的查询计划。查询计划取决于很多因素,包括(但不限于)SQL、确切的表结构、表的统计信息、可用索引等。

由于您的两个查询非常简单,我猜它们会产生相同(或非常相似)的执行计划,从而产生相当的性能。

(对于大型、复杂的查询,SQL 的确切措辞可以有所作为,Dan Tow 的书SQL Tuning 对此提供了很多很好的建议。)

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 2013-11-17
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多