簡體   English   中英

查詢速度非常快,但使用 dapper 映射速度很慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM