Почему мой план запросов Sql Server использует сканирование вместо поиска при подключении данных?

Исходя из фона MySQL, мне трудно понять, что случилось со следующей настройкой.

У меня две переменные таблицы и размерность

Оба имеют первичный ключ, кроме того, переменная имеет внешний ключ для измерения с именем dimension_instance_1_uid, на котором был создан индекс.

Когда я выполняю такой запрос

SELECT
this_.name, dimensioni4_.name
FROM dbo.variable this_
INNER JOIN dbo.dimension_instance dimensioni4_
-- even with index hint nothing changes...
-- WITH (INDEX(PK_dimension_instance))
ON this_.dimension_instance_1_uid = dimensioni4_.UID

кажется, что индекс не используется для seek и scan выполняется в соответствии с планом выполнения. Он показывает два индекса сканирования, а не один индекс сканирования и один индекс поиска.

Я бы ожидал, что индекс будет искать, потому что в моем случае в dimension_instance только 10 из 15k записей соответствуют записям в таблице variable.

Может кто-нибудь пролить свет на мое непонимание того, как работают индексы MS SQL.

3 ответа

В Плане выполнения запроса и Оптимизаторе запросов оценивается, что лучше делать в отношении данных внутри db и других переменных: в вашем случае, возможно, он считает, что запрос будет менее дорогостоящим, если сканирование индекса вместо поиска: это может быть вызваны из числа низких строк


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

Я слепой, ты слепой, или ты опубликовал неправильный план выполнения?

В плане есть две исходные таблицы, а bot - кластерное сканирование индексов. Это 100% использование индекса для доступа к исходной таблице.

Теперь, почему сканирование, а не поиск -well, потому что у вас нет каких-либо ограничений (где предложение), и это может быть самым быстрым способом. Если машина te предполагает, что обе таблицы должны быть полностью прочитаны, зачем делать поиск вместо сканирования?


Может кто-нибудь пролить свет на мое непонимание того, как работают индексы MS SQL.

Это не те индексы, которые вы неправильно поняли, но Hash Join. Hash Join просто не используется для индексов в предикатах соединения (в отличие от объединения вложенных циклов).

http://use-the-index-luke.com/sql/join/hash-join-partial-objects

licensed under cc by-sa 3.0 with attribution.