SQL On Subselect of Table而不是整个表时的性能差异

时间:2013-11-05 10:59:29

标签: sql sql-server sql-server-2012

这是一般性问题,而不是我自己的特定数据库。

这是一个简单的数据库示例。为简单起见,我省略了数据类型,因为它们不感兴趣。

动物

ID, Name, Specie, OwnerID

所有者

ID, Name, Street, City, Country

如果我做

,现在性能会有所不同
SELECT o.Name
FROM [Animals] a
INNER JOIN (SELECT ID, Name FROM [Owner]) o ON o.ID = a.OwnerID

而不是简单

SELECT o.Name
FROM [Animals] a
INNER JOIN [Owner] o ON o.ID = a.OwnerID

所以,我认为可能会有更高的性能,因为我不会在整个桌子上。 但我认为可能是SQL足够聪明,内部几乎一样。

我试着在我自己的数据库中测量它,但我无法测量到足够大的差异,以确保它不仅仅是地板噪音。

1 个答案:

答案 0 :(得分:4)

是否存在性能差异取决于SQL Server正在使用的查询计划,而查询计划又依赖于特定的表结构,包括索引,外键约束和数据类型。这也可以根据您拥有的数据量以及分布方式而改变。

对于您发布的两个查询,假设this relatively-simple table structure and data,两个查询都有如下所示的执行计划,这意味着SQL Server对这两个查询都遵循相同的算法。

Sample execution plan

您可以使用Sql Server Management Studio来运行这些查询。寻找名为“包含实际执行计划”的工具栏按钮,启用它,然后再次运行它们。除了通常的“结果”和“消息”选项卡之外,您还将获得一个“执行计划”选项卡,显示SQL Server选择的算法的可视化表示。比较这两个计划将告诉您SQL对两个查询的行为是否相同。

有关计划及其含义的更多详情,请查看StackOverflow: how to read a execution plan in SQL Server