2011-09-24 68 views
0

我們有一個表叫做PurchasesASP.NET/SQL服務器 - 超時已過期,而搜索

| 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現在索引,還沒有我會做的運氣
+0

可能的重複[如何增加我的存儲過程調用的超時時間(請參閱錯誤)?](http://stackoverflow.com/questions/841509/how-do-i-increase-the-timeout-期間爲我的存儲過程呼叫看到錯誤) – adatapost

+0

你真的**需要所有列?如果不是,請選擇您真正需要的那些列! –

+0

他不問如何消除錯誤,他問爲什麼要做類似的操作需要更長的時間以及如何解決性能問題。 –

回答

0

我將我的SqlCommand的CommandTimeout屬性設置得更高,而不是使查詢更快。它沒有解決速度問題,但解決了超時問題。

1

的第一件事是檢查索引上PRSNumber,我假設這個字段有一個索引,這個表非常大。

將索引添加到新字段可能會解決問題(如果是這種情況)。

的代碼添加索引:

CREATE INDEX IX_Purchases_ProjectCode 
ON dbo.Purchases (ProjectCode); 

更新:

我也嘗試添加字段爲VARCHAR消除從公式的數據類型的變化。

+0

Spenc,是的,PRSNumber是主鍵... – dpp

+0

我忘了,我已經爲ProjectCode添加了一個索引。仍然一樣...我應該重新啓動任何東西嗎?做一些查詢或什麼? – dpp

+0

這兩個查詢在SQL Management Studio中需要多長時間?並且是與SQL Server實例在同一臺機器上的ASP.Net服務器? –