在 Slick 中获得单一结果的最有效方法是什么?
What is the most efficient way to get single result in Slick?
我想知道以下两行中哪一行效率更高:
db.run(events (..filter/sort..) .take(1).result.head)
或
db.run(events (..filter/sort..) .result.head)
因为我发现 .take 来自 slick.lifted.Query
和 .head 来自 slick.profile.BasicStreamingAction
下面使用 take(1)
的代码是有效的,因为 take(1)
转换为生病的 SQL 然后底层关系数据库的查询优化器进行优化以仅选择第一行结果。
db.run(events (..filter/sort..) .take(1).result.head)
但是在应用层只有 .head
的情况下,slick 不会将该代码转换为 SQL 因此,它不会与底层关系数据库通信。没有进行任何优化。当 .head
在应用程序级别完成时,将从关系数据库返回的符合条件的行中选择一行。在应用层排第一显然效率不高
.take(1)
将在 SQL 查询中转换为 LIMIT 1
。
.head
在应用层查询结果后确实给出了结果集的第一个元素(结果集可能非常大,而且效率很低而且很慢)。
.take(1)
只会在数据库级别给出一行。它非常高效。
您应该使用 headOption,因为使用 head 不是一个好习惯。如果结果为空,它可能会破坏您的代码。
db.run(events (..filter/sort..) .take(1).result.headOption)
我想知道以下两行中哪一行效率更高:
db.run(events (..filter/sort..) .take(1).result.head)
或
db.run(events (..filter/sort..) .result.head)
因为我发现 .take 来自 slick.lifted.Query
和 .head 来自 slick.profile.BasicStreamingAction
下面使用 take(1)
的代码是有效的,因为 take(1)
转换为生病的 SQL 然后底层关系数据库的查询优化器进行优化以仅选择第一行结果。
db.run(events (..filter/sort..) .take(1).result.head)
但是在应用层只有 .head
的情况下,slick 不会将该代码转换为 SQL 因此,它不会与底层关系数据库通信。没有进行任何优化。当 .head
在应用程序级别完成时,将从关系数据库返回的符合条件的行中选择一行。在应用层排第一显然效率不高
.take(1)
将在 SQL 查询中转换为 LIMIT 1
。
.head
在应用层查询结果后确实给出了结果集的第一个元素(结果集可能非常大,而且效率很低而且很慢)。
.take(1)
只会在数据库级别给出一行。它非常高效。
您应该使用 headOption,因为使用 head 不是一个好习惯。如果结果为空,它可能会破坏您的代码。
db.run(events (..filter/sort..) .take(1).result.headOption)