Почему SQL Server использует вложенный цикл - PullRequest
5 голосов
/ 02 апреля 2012

У меня есть запрос, например:

SELECT TOP 10 
  User.id,
  User.Name,
  Country.Country
  FROM User  
  Inner Join Country 
  ON Country.Id = User.CountryId
  where User.PlanId = 1

В этом случае диспетчер SQL показывает в плане выполнения, что использует Hash-match, и это довольно быстро.

Но если я использую где User.PlanId = 2 Менеджер SQL использует для моего запроса вложенный цикл, и он очень медленный ... Почему при разных критериях поиска он использует разные алгоритмические алгоритмы?Как я могу это исправить?

1 Ответ

3 голосов
/ 02 апреля 2012

Я собираюсь предположить, что у вас гораздо больше пользователей с PlanID, равным 2, чем с 1.

Это объяснит как изменения в плане exec, так и во время выполнения.HASH MATCH является наиболее универсальным (и, как правило, наименее эффективным) объединением.По сути, движок создает таблицу, вручную объединяющую все значения.

A NESTED LOOP проверяет каждое значение слева по отношению к каждому значению справа и хорошо работает, когда один набор данных намного больше другогои обе стороны индексируются.

A HASH MATCH может быть быстрым, если у вас действительно небольшой набор данных.Я подозреваю, что разница в скорости из-за разного размера наборов данных.Вы можете проверить это довольно просто:

SELECT PlanId, COUNT(*) as CT
FROM User
GROUP BY PlanID

... что даст вам ваш дистрибутив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...