2019年10月1日 星期二

[ASP.NET] ADO.NET Parameters.AddWithValue 效能問題

最近發現在一個簡單的查詢語法發現效能不佳,
經查發現問題出在SqlCommand參數化查詢使用 AddWithValue,
改善後 原查詢耗時 950 ms 調整後為 24 ms!


參考: 史丹利好熱 的相關文章:

[.NET] ADO.NET Parameters.AddWithValue 對於SqlDbType的抉擇


史丹利好熱文中提到:

AddWithValue 參數化查詢時,在DbType的選擇是採.NET資料類型來決定,若查詢參數型別與實際欄位不同時有時可能會造成額外的成本

解決方式:

不要使用AddWithValue,改用 SqlParameter,並指定 SqlDbType
範例:
            SqlCommand cmd = new SqlCommand(qs, sqlConnection);
            SqlParameter p_gen01 = new SqlParameter();
            p_gen01.SqlDbType = SqlDbType.VarChar;
            p_gen01.ParameterName = "@empno";
            p_gen01.Value ="ep0020";


若使用Dapper 指定型態方式,參考範例:
            var result = sqlConnection.Query(qs,
                                            new { empno = new DbString() {
                                                Value = "ep0020",
                                                IsAnsi = true, } });