内部联接与子查询效率

时间:2019-03-28 10:24:50

标签: sql sql-server tsql sql-server-2014

我有两个SQL表,“国家”和“国家/地区” I18N:

Countries > Code
CountriesI18N > CountryCode, LanguageCode, Name

我正在获取选择以下内容的国家/地区列表:

  1. 国家代码。
  2. 国家/地区名称I18N,提供了一种语言。

第一个T-SQL选项如下:

SELECT [x].[Code], (
  SELECT TOP(1) [z].[Name]
  FROM [CountriesI18N] AS [z]
  WHERE ([z].[LanguageCode] = 'en' AND ([x].[Code] = [z].[CountryCode])
) AS [Name]
FROM [Countries] AS [x]

enter image description here

以及使用内部联接的替代方法:

SELECT [x].[Code], [x.CountriesI18N].[Name]
FROM [Countries] AS [x]
INNER JOIN [CountriesI18N] ON [x].[Code] = [x.CountriesI18N].[CountryCode]
WHERE [x.CountriesI18N].[LanguageCode] = 'en'

enter image description here

它们在速度和效率上是否相等?

如果我有很多使用许多InnerJoins或Subqueries的相关表是否等效?

1 个答案:

答案 0 :(得分:0)

首先,它们不是等效查询。对于您的特定数据,它们可能外观等效,但事实并非如此。子查询返回最多一个匹配项。 inner join过滤掉不匹配项,并可以返回重复项。

所以,您正在比较苹果和橙子。

无论哪种情况,您都希望在 CountriesI18N(CountryCode, LanguageCode)。这恰好是这两个查询版本的最佳索引。