我们有一个名为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)
ProjectCode
已编入索引更新
ProjectCode
现已编入索引,仍然没有运气答案 0 :(得分:1)
我要做的第一件事是检查PRSNumber上的索引,我假设该字段上有一个索引,表格非常大。
为新字段添加索引可能会解决问题(如果是这种情况)。
添加索引的代码:
CREATE INDEX IX_Purchases_ProjectCode
ON dbo.Purchases (ProjectCode);
更新
我还尝试将该字段添加为varchar,以消除方程式中的数据类型更改。
答案 1 :(得分:0)
我将SqlCommand的CommandTimeout
属性设置得更高,而不是让查询更快。它没有解决速度,但解决了超时问题。