Если технология не улучшилась так, как я не могу представить в последнее время, показанный запрос "IN" даст результат, который фактически будет OR из трех наборов результатов, по одному для каждого из значений в списке "IN" , Предложение IN становится условием равенства для каждого списка и при необходимости будет использовать индекс. В случае уникальных идентификаторов и достаточно большой таблицы, я ожидаю, что оптимизатор будет использовать индекс.
Однако, если элементы в списке должны быть неуникальными, и я предполагаю, что в примере «TypeId» является внешним ключом, тогда меня больше интересует распределение. Мне интересно, будет ли оптимизатор проверять статистику для каждого значения в списке? Скажем, он проверяет первое значение и находит его в 20% строк (достаточно большой таблицы, чтобы иметь значение). Это, вероятно, будет сканирование таблицы. Но будет ли использоваться тот же план запроса для двух других, даже если они уникальны?
Это, вероятно, спорный вопрос - что-то вроде таблицы Employee, вероятно, будет достаточно маленьким, чтобы она оставалась в кэше в памяти, и вы, вероятно, не заметите разницу между этим и индексированным поиском в любом случае.
И, наконец, пока я проповедую, остерегайтесь запроса в предложении IN: часто это быстрый способ заставить что-то работать и (по крайней мере для меня) может быть хорошим способом выразить требование, но это почти всегда лучше переформулировать как объединение. Ваш оптимизатор может быть достаточно умен, чтобы заметить это, но с другой стороны это может и не быть. Если вы в настоящее время не проверяете производительность по объемам производственных данных, сделайте это - в наши дни оптимизации на основе затрат вы не можете быть уверены в плане запроса, пока не получите полную загрузку и репрезентативную статистику. Если вы не можете, тогда будьте готовы к неожиданностям в производстве ...