2012-04-02 3 views
5

У меня есть запрос, например:Зачем использовать SQL Server Уплотненного Loop

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

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

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

+2

Также, сколько строк в таблице, сколько из них имеет PlanId = 1, и сколько из них имеют PlanId = 2? –

+0

'Country.Id' является первичным ключом или, по крайней мере, уникальным? hmm .. иногда обходным может быть использование 'left join' + add condition', а user.countryid не null'. – Aprillion

+0

У меня есть planId = 1 около 2500 строк и planId = около 280 строк. И Country.Id = User.CountryId имеет отношение один к одному – Reno

ответ

3

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

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

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

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

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

... который предоставит вам ваше распределение.

Смежные вопросы