查询速度非常快,但映射速度慢,而且速度慢

时间:2014-08-06 18:24:33

标签: sql dapper

我正在使用短小精悍的新项目并喜欢它,但我不明白为什么我的查询真的很慢。执行时间非常快,几乎是即时的,但连接保持打开的时间更长,而dapper将结果映射到我想要的对象。

以下是一瞥示例:

Glimpse result

这个查询只是一个类似15个字段的SELECT,主键上有一个位置,因此执行速度非常快,并且不会返回那么多数据。 我执行它的代码是:

 using (var conn = GetConnection())
 {
    obj = conn.Get<T>(id);
 }

该对象是一个非常基本的poco与字符串和Ints。 那么为什么我在执行此操作时浪费了220毫秒,而查询执行本身需要3毫秒?区别在哪里?

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

我和Dapper有类似的经历,因为我试图从View投影到POCO对象。对我来说问题很明显,我的对象上的每个属性都没有列,所以Convert.ChangeType()非常慢。我在我的View中添加了一个总是返回NULL的列,并且Query()调用显着加快了。

答案 1 :(得分:3)

更新

在我的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秒的时间内完成。

所以我的建议是,你使用“匿名映射”,直到dapper家伙修复它,如果他们能够。

答案 2 :(得分:1)

在我的示例中,数据库具有类型为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 });

答案 3 :(得分:0)

就我而言,性能不佳似乎是由于我在执行SELECT时使用星号而不是字段列表(即SELECT *而非SELECT Foo, Bar, Baz, ... )。