我们有一个名为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
是nvarchar(10)
- 这两个查询在 SQL Server Management Studio 中都能正常工作
- 第一个查询在 ASP.NET 网站中有效,但第二个查询无效
ProjectCode
被索引- 该表有 32k 行
更新
ProjectCode
现在已编入索引,仍然没有运气