У Michael Feathers есть интересное определение в его книге, Работающей Эффективно с Унаследованным кодом. Согласно ему унаследованный код является кодом без автоматизированных тестов.
Является ли дилерId или Lastname nvarchar (тип которого отличается от параметров varchar)?
Это может вызвать преобразование целых индексов. Если вы обнаружите, что это так, оставьте комментарий, и я объясню более подробно.
Я несколько раз видел, что у вас есть несоответствие между типами nvarchar и varchar для параметра запроса в индексированном поле. Это может произойти, если вы используете varchar в своей базе данных и не задаете явно тип вашего параметра в .Net, который по умолчанию будет принимать nvarchar.
В этом случае Sql Server выбирает более правильный вариант, а не более эффективный. Вместо того, чтобы просто преобразовать ваш параметр в varchar, что было бы сужающим преобразованием, которое потенциально могло бы потерять информацию, база данных будет вынуждена преобразовать каждое значение для этого столбца в таблице в nvarchar (что гарантированно будет успешным без потери информации) . Это не только медленно, но и Sql Server больше не сможет использовать индекс. Излишне говорить, что выполнение запроса займет гораздо больше времени.
У меня есть та же проблема, процедура, выполняемая из .net, которая занимает слишком много времени (и не возвращает много строк). Я отправляю в sql строку: "execute stored_procedure @ parameter1 = value1", копирую ее и запускаю в sql management studio, но там все работает нормально. Причина этого случая заключается в том, что в моем запросе я просто добавляю или удаляю БУКВУ из значения параметра. Я очень запутался.
Для информации, я использую полнотекстовый индекс и временные таблицы для разбиения на страницы, но, как я уже сказал, ТО ЖЕ ЗАПРОС (и я уверен) отлично работает в студии управления sql.