【发布时间】:2021-05-27 00:23:08
【问题描述】:
我在 Dapper 中使用带有参数的原始 SQL。查询速度正常。
类似这样的:
string sql = "SELECT * FROM SomeTable WHERE messages IN ('Volvo', 'BMW', 'Ford', 'Mazda')"
var results = conn.Query(sql);
当我用@messages更改参数时,速度太慢了:
string sql = "SELECT * FROM SomeTable WHERE messages IN (@cars)"
string[] cars = { "Volvo", "BMW", "Ford", "Mazda" };
var results = conn.Query(sql, new {cars});
PS:string[] 大小几乎是 300。
【问题讨论】:
-
查询由服务器执行,而不是 Dapper。它的性能取决于
messages是否被索引。 -
也许您可以跟踪执行的查询并检查计划以确定有什么不同?
-
string[] size is almost 300.您是否尝试过使用包含 300 个项目的原始字符串?不可能将值数组作为参数传递,因此 Dapper 实际上会生成一个带有这些值的IN子句。这两个查询应该是相同的。 -
@PanagiotisKanavos 实际上,我相信 Dapper 将创建一个包含 300 个 sql 参数的查询,而不是另一个在查询中硬编码值的查询。所以使用参数可能会产生一些开销,但我怀疑它会不会很明显。
-
@juharr 在这种情况下,服务器将无法计算这些值的统计信息。如果
sometable太小,服务器可能会决定使用扫描而不是查找,特别是因为它需要检索所有列。顺便说一句,没有表架构和行数,我们就像服务器一样盲目。