ASP.NET / SQL Server - истекло время ожидания при поиске - PullRequest
0 голосов
/ 24 сентября 2011

У нас есть таблица с именем 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 теперь проиндексирован, все равно не повезло

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Первое, что я хотел бы сделать, это проверить индекс в PRSNumber, я предполагаю, что в этом поле есть индекс, и таблица очень большая.

Добавление индекса в новое поле, скорее всего, решит проблему (если это так).

Код для добавления индекса:

CREATE INDEX IX_Purchases_ProjectCode 
ON dbo.Purchases (ProjectCode); 

Обновление:

Я бы также попытался добавить поле как varchar, чтобы исключитьизменение типа данных из уравнения.

0 голосов
/ 07 июня 2012

Я установил свойство CommandTimeout моего SqlCommand выше, вместо того, чтобы сделать запрос быстрееЭто не решило скорость, но решило проблему тайм-аута.

...