Вы можете попробовать обновить статистику, иногда это помогает запросам выбрать соответствующие индексы, особенно если вы не сделали этого в течение некоторого времени и вставили или обновили много данных.
UPDATE STATISTICS TableB
Вы также можетепопробуйте использовать подсказку оптимизатора :
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y WITH (INDEX(ClusteredIndexName)) -- Huge table
ON (X.A = Y.Name OR X.B = Y.Name)
. Вы можете увидеть, какие индексы используются, используя «Показать предполагаемый план выполнения» в меню запроса (CTRL + L вместо CTRL + E).), но редко фактический запрос будет настроен по-другому.
Я бы также рекомендовал подсказку NOLOCK.Обычные запросы устанавливают общую блокировку данных, к которым они получают доступ, предотвращая обновление этих строк.С этой блокировкой также связаны некоторые накладные расходы.Использование NOLOCK может ускорить ваш запрос и увеличить параллелизм, но может привести к грязному чтению.Допустим, одна из этих строк в вашем большом запросе обновляется в середине его выполнения.Вы можете получить как старые, так и новые строки в ваших результатах (я думаю, никогда не видел, чтобы это произошло).Если вы не используете NOLOCK, это обновление может блокироваться до тех пор, пока ваш запрос не будет завершен, что может привести к превышению времени ожидания важного обновления.
SELECT X.A, X.B, X.GroupName
FROM TableA X WITH (NOLOCK)
INNER JOIN TableB Y WITH (NOLOCK, INDEX(ClusteredIndexName)) -- Huge table
ON (X.A = Y.Name OR X.B = Y.Name)