ASP.NET / SQL Server - 搜索时超时已过期

时间:2011-09-24 07:01:09

标签: sql-server-2005 timeoutexception

我们有一个名为Purchases的表格:

| PRSNumber   | ... | ... | ProjectCode |
| PRJCD-00001 |     |     | PRJCD       |
| PRJCD-00002 |     |     | PRJCD       |
| PRJCD-00003 |     |     | PRJCD       |
| PRJX2-00003 |     |     | PRJX2       |
| PRJX2-00003 |     |     | PRJX2       |

注意:ProjectCodePRSNumber的前缀。

之前,当表格中没有ProjectCode字段时,我们以前的开发人员使用此查询来搜索特定供应商的购买:

select * from Purchases where left(PRSNumber,5) = @ProjectCode

是的,他们连接PRSNumber以获取并比较ProjectCode。虽然,无论表设计如何,上面的代码都可以正常工作。

但是当我添加一个新字段ProjectCode时,请使用此查询:

select * from Purchases where ProjectCode = @ProjectCode

我收到此例外:

  

超时已过期。完成前经过了超时时间   操作或服务器没有响应。

我无法相信,在比较之前需要连接的第一个查询比第二个除了比较之外什么都不做的查询要快。你能告诉我为什么会这样吗?

可能有用的一些信息:

  • PRSNumbervarchar(11),是主键
  • ProjectCodenvarchar(10)
  • 两个查询在SQL Server Management Studio中都可以正常工作
  • 第一个查询在ASP.NET网站中有效,但第二个查询不在
  • ProjectCode已编入索引
  • 该表有32k行

更新

  • ProjectCode现已编入索引,仍然没有运气

2 个答案:

答案 0 :(得分:1)

我要做的第一件事是检查PRSNumber上的索引,我假设该字段上有一个索引,表格非常大。

为新字段添加索引可能会解决问题(如果是这种情况)。

添加索引的代码:

CREATE INDEX IX_Purchases_ProjectCode 
ON dbo.Purchases (ProjectCode); 

更新

我还尝试将该字段添加为varchar,以消除方程式中的数据类型更改。

答案 1 :(得分:0)

我将SqlCommand的CommandTimeout属性设置得更高,而不是让查询更快。它没有解决速度,但解决了超时问题。