[英]Query very fast but mapping slow with dapper
我正在為一個新項目使用 dapper 並喜歡它,但我不明白為什么我的查詢真的很慢。 執行時間非常快,幾乎是即時的,但是我猜在 dapper 將結果映射到我的對象時,連接保持打開狀態的時間要長得多。
這里是一個在瞥見的例子:
這個查詢只是對 15 個字段的 SELECT,主鍵上有一個 where,因此執行起來非常快,並且不會返回那么多數據。 我執行它的代碼是:
using (var conn = GetConnection())
{
obj = conn.Get<T>(id);
}
該對象是一個非常基本的 poco,帶有 Strings 和 Ints。 那么為什么我要浪費 220 ms 而查詢執行本身需要 3 ms 呢? 區別在哪里?
謝謝你的幫助 !
更新
在我的 SQL 語句的選擇部分中,有一個字段給我帶來了問題。 我只是逐一刪除每個字段,然后找到導致問題的那個。
我不得不像這樣將我的一個字段轉換為 nvarchar:
CAST(my_field AS nvarchar(max)) as my_field
原答案
它必須對映射做一些事情。 因為如果我將它從“強類型”(這需要永遠,將近 1 分鍾)更改:
var products = connection.Query<Product>(sql).ToList();
對“匿名”:
var products = connection.Query(sql).ToList();
然后它執行得非常快(1秒)。
我直接在“SQL Server Management Studio”中嘗試並執行 SQL 語句作為查詢,它在不到 1 秒的時間內完成。
所以我的建議是,你使用“匿名映射”,直到精巧的家伙能夠解決這個問題。
當我嘗試從視圖投影到 POCO 對象時,我對 Dapper 也有類似的體驗。
問題最終是對我來說,我的對象上的每個屬性都沒有一列,因此Convert.ChangeType()
非常慢,我向我的 View 添加了一個總是返回NULL
,而Query<T>()
調用顯着加快。
在我的示例中,數據庫有一個VARCHAR(10)
類型的索引列。 我試圖通過 dapper 參數進行過濾,如下所示:
DbConnection con = ...
string filterParam = "test";
var results = con.Query("SELECT IndexColumn, Column1, ... FROM MyTable WHERE IndexColumn = @filterParam", new { filterParam });
問題是 dapper(或可能是 ADO.Net)將我的filterParam
轉換為NVARCHAR(MAX)
數據類型。 Sql Server 然后將IndexColumn
轉換為NVARCHAR
,並進行全表掃描而不是索引查找。 通過在比較之前轉換參數來修復代碼:
var results = con.Query("SELECT IndexColumn, Column1, ... FROM MyTable WHERE IndexColumn = CAST(@filterParam AS VARCHAR(10))", new { filterParam });
在我的情況下,性能不佳似乎是由於我在執行SELECT
時使用星號而不是字段列表(即SELECT *
而不是SELECT Foo, Bar, Baz, ...
)造成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.