Проблема в том, что он очень медленный на больших таблицах
Проблема в том, что тот, кто спроектировал, не знал основ SQL.
IndexOf - или что-то, чтоне начинается в начале строки - убивает sargeability.Период.Это означает, что любой индекс не будет использоваться.Это означает, что в основном вы выполняете сканирование таблицы и на каждом столе должны проходить через символы и сравнивать их до ... ну.А ToUpper делает или не может на самом деле делать что-либо - сравнение полей определяется на уровне SQL по индексу сопоставления, и если это не «принимать во внимание верхний / нижний значения», у вас просто нет операции на руке.
То, что вы МОЖЕТЕ сделать, это:
- Выполните те на отдельном соединении, которое использует более низкую гарантию транзакции (Readcommitted), чтобы не оставлять блокировки на столе.Стандартное соединение сериализуемо, ПОЛНОСТЬЮ не подходит для справочных таблиц.
- Вы можете захотеть скрыть таблицу и использовать индекс, который перенаправляет таблицу с использованием readcommmitted для этого.
- Или загрузить их в память ОДИН РАЗ, а затем запустить ее параллельнов памяти, зависит от того, является ли это серверным кодом.
В конце концов, поиск IN-строк ЧРЕЗВЫЧАЙНО трудоемок, и вы ОЧЕНЬ мало можете сделать, и SQL, как правило, не оптимизирован для этого.Это не проблема EF и не Linq2SQL - в значительной степени, поскольку ваши водительские права не определяют, что ваш автомобиль не является самолетом.SQL обычно не обрабатывает этот тип запросов прилично.