我正在使用短小精悍的新项目并喜欢它,但我不明白为什么我的查询真的很慢。执行时间非常快,几乎是即时的,但连接保持打开的时间更长,而dapper将结果映射到我想要的对象。
以下是一瞥示例:
这个查询只是一个类似15个字段的SELECT,主键上有一个位置,因此执行速度非常快,并且不会返回那么多数据。 我执行它的代码是:
using (var conn = GetConnection())
{
obj = conn.Get<T>(id);
}
该对象是一个非常基本的poco与字符串和Ints。 那么为什么我在执行此操作时浪费了220毫秒,而查询执行本身需要3毫秒?区别在哪里?
感谢您的帮助!
答案 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, ...
)。