2008-12-05 25 views
0

我一直在使用cmd.Parameters.AddWithValue,而沒有指定DBType(int,varchar,...)來運行查詢。查看SQL Profiler後,似乎查詢運行此方法的運行速度要比指定數據類型慢很多。AddWithValue without DBType導致查詢運行緩慢

爲了讓你瞭解它有多慢,這裏有一個例子。查詢是對單個表的簡單查詢,並且where語句中的列被編入索引。指定數據類型時,某個查詢運行大約0 MS(對於要測量的sql server而言太小),並且需要41次讀取。當我刪除DBType時,可能需要大約200毫秒,並且10000次讀取才能完成查詢。

我不確定它是否只是SQL Profiler誤報值,或者如果這些值實際上是正確的,但它是可重複的,因爲我可以添加和刪除DBType,並且它會生成SQL Profiler中給出的值。

有沒有人遇到過這個問題,以及一個簡單的方法來解決它。我意識到我可以在我的代碼中添加數據類型,但這似乎有很多東西需要添加,如果有更簡單的方法來解決它,那將是非常感謝。

[編輯]

一些初始測試(在運行在一個循環中這兩種情況下)之後,好像值分析器即給出是準確的。

就像添加的信息一樣,我在Windows XP Pro上運行.Net 2.0,在Windows 2000上運行SQL Server 2000上的SQL Server 2000。

[更新]

經過一番周圍挖,我能找到這個blog post,這可能是相關的。似乎.Net中的字符串值(因爲它們是unicode)會自動創建爲nvarchar參數。我必須等到週一纔開始工作,看看能否解決問題。儘管如此,我仍然需要設置數據類型,這正是我試圖避免的。

這個問題並沒有顯示出我所做的每一個查詢,只是一些選擇,所以我仍然可能會訴諸在有問題的查詢中設置DBType,但我正在尋找一個更廣義的解決方案問題。

回答

0

什麼是在這兩種情況下生成的SQL語句?

我懷疑它沒有明確指定它時將值視爲varchar。

例如SELECT OrderId FROM Orders WHERE OrderId = 1001
VS SELECT OrderId FROM Orders WHERE OrderId = '1001'

+0

有問題的參數實際上是一個varchar場,所以我不認爲這會是問題。 – Kibbee 2008-12-06 01:42:18

5

的問題是關係到SQL服務器如何做隱式類型轉換。如果使用NVARCHAR值(即.N'some文本)篩選VARCHAR列,則SQL無法將列轉換爲NVARCHAR,因爲NVARCHAR不能隱式轉換回VARCHAR。

您最佳的解決方法是指定類型或將數據庫列更改爲NVARCHAR。

2

我剛碰到這個問題。我有一個有很多char列的遺留數據庫。沒有指定列的類型,結果在我的一個查詢中花了幾分鐘。 (它默認爲nvarchar。)指定列類型導致結果花費幾秒鐘。

cmd.Parameters.AddWithValue("charcolumn", "stringvalue"); 
cmd.Parameters[0].SqlDbType = SqlDbType.Char; 

我想我會嘗試讓每個字符串查詢作爲字符類型,並看看如何去。

看完這個[編輯]

其實...: http://www.u2u.info/Blogs/U2U/Lists/Posts/Post.aspx?ID=11

我決定去與此解決方案:

cmd.Parameters.AddWithValue(colName, val); 
if(val is string) 
    cmd.Parameters[i].DbType = DbType.AnsiString; 
+0

您發佈的鏈接不存在。你有可能更新嗎? – 2013-01-14 17:41:47