Внутреннее объединение против эффективности подзапроса - PullRequest
0 голосов
/ 28 марта 2019

У меня есть две таблицы 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

и альтернативное использование Inner Join:

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 или подзапросов, это эквивалентно?

1 Ответ

0 голосов
/ 28 марта 2019

Во-первых, они не являются эквивалентными запросами. Для ваших конкретных данных они могут выглядеть эквивалентными, но это не так. Подзапрос возвращает не более одного совпадения. inner join отфильтровывает несоответствия и может возвращать дубликаты.

Итак, вы сравниваете яблоки и апельсины.

В любом случае вам нужен индекс на CountriesI18N(CountryCode, LanguageCode). Это лучший индекс для обеих версий запроса.

...