[.NET] Dapper ORM 查詢參數問題

繼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的系統都是新寫的小系統,慢慢再調整過來。

含笑半步顛....

參考:

Dapper

Be careful with varchars in Dapper!