繼ADO.NET Sqlcommand AddWithValue可能產生的效能問題,那麼Dapper有沒有類似的情形?
針對居家旅行 殺人滅口 必備良藥Dapper與參數化的實驗:
準備好資料表class,待會Dapper會來 Mapping。
資料庫內的資料表及資料可以參考這篇前半段建起來。
public class TableSqlDbType
{
public string C1 { get; set; }
public string C2 { get; set; }
}
執行實驗(1),直接組T-SQL(無參數)
//使用Dapper查詢
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["CN"].ConnectionString))
{
string query = "select * from TableSqlDbType where c1 = '10000' ";
var Results = db.Query<TableSqlDbType>(query);
//顯示資料
foreach (var TableSqlDbType in Results)
{
Console.WriteLine("C1:{0} C2:{1}", TableSqlDbType.C1, TableSqlDbType.C2);
}
}
預設還是VARCHAR! Good Job!
快取查詢計畫的彙總效能統計資料
SELECT * FROM [TableSqlDbType] WHERE [c1]=@1 (@1 varchar(8000))SELECT * FROM [TableSqlDbType] WHERE [c1]=@1
執行時間(ms): 0.039000
執行實驗(2):參數化查詢,未指定型別。
//使用Dapper查詢
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["CN"].ConnectionString))
{
string query = "select * from TableSqlDbType where c1 = @c1 ";
var Results = db.Query<TableSqlDbType>(query, new { C1 = "10001" });
//顯示資料
foreach (var TableSqlDbType in Results)
{
Console.WriteLine("C1:{0} C2:{1}", TableSqlDbType.C1, TableSqlDbType.C2);
}
}
驚!果然預設跑去NVARCHAR他家玩沙子去了,效能有受到影響。
從快取查詢計畫的彙總效能統計資料
select * from TableSqlDbType where c1 = @c1 (@C1 nvarchar(4000))select * from TableSqlDbType where c1 = @c1
執行時間(ms):0.079000
執行實驗(3):參數化查詢,指定型別。
//使用Dapper查詢
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["CN"].ConnectionString))
{
string query = "select * from TableSqlDbType where c1 = @c1 ";
var Results = db.Query<TableSqlDbType>(query,
new { C1 = new DbString() { Value = "10000", IsAnsi = true, Length = 8 } });
//顯示資料
foreach (var TableSqlDbType in Results)
{
Console.WriteLine("C1:{0} C2:{1}", TableSqlDbType.C1, TableSqlDbType.C2);
}
}
從快取查詢計畫的彙總效能統計資料
select * from TableSqlDbType where c1 = @c1 (@C1 varchar(8))select * from TableSqlDbType where c1 = @c1
執行時間(ms):0.037000
總結:效能雖有影響但差距不大,也許和資料庫Cache有關,先筆記下來Dapper設定型別的方式,好在用Dapper的系統都是新寫的小系統,慢慢再調整過來。
含笑半步顛....
參考:
Be careful with varchars in Dapper!