У нас есть таблица с именем Purchases
:
| PRSNumber | ... | ... | ProjectCode |
| PRJCD-00001 | | | PRJCD |
| PRJCD-00002 | | | PRJCD |
| PRJCD-00003 | | | PRJCD |
| PRJX2-00003 | | | PRJX2 |
| PRJX2-00003 | | | PRJX2 |
Примечание: ProjectCode
- это префикс PRSNumber
.
Раньше, когда в таблице не было поля ProjectCode
, наши бывшие разработчики использовали этот запрос для поиска покупок у определенного поставщика:
select * from Purchases where left(PRSNumber,5) = @ProjectCode
Да, они объединяют PRSNumber
, чтобы получить и сравнить ProjectCode
. Несмотря на то, что приведенный выше код работает нормально, независимо от дизайна таблицы.
Но когда я добавил новое поле, ProjectCode
и использовал этот запрос:
select * from Purchases where ProjectCode = @ProjectCode
Я получаю это исключение:
Истекло время ожидания. Тайм-аут истек до завершения
операции или сервер не отвечает.
Не могу поверить, что первый запрос, который требует конкатенации перед сравнением, быстрее, чем второй, который ничего не должен делать, кроме сравнения. Подскажите, пожалуйста, почему это происходит?
Некоторая информация, которая может оказаться полезной:
PRSNumber
равен varchar(11)
и является первичным ключом
ProjectCode
is nvarchar(10)
- Оба запроса отлично работают в SQL Server Management Studio
- Первый запрос работает на веб-сайте ASP.NET, но второй не
ProjectCode
индексируется
- Таблица имеет 32 тыс. Строк
Обновление
ProjectCode
теперь проиндексирован, все равно не повезло