在Slick中获得单个结果的最有效方法是什么?

时间:2016-10-19 16:45:19

标签: scala slick

我想知道以下哪两行效率更高:

db.run(events (..filter/sort..) .take(1).result.head)

db.run(events (..filter/sort..) .result.head)

我发现 .take 来自 slick.lifted.Query

来自 slick.profile.BasicStreamingAction

.head

2 个答案:

答案 0 :(得分:7)

下面使用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)只会在数据库级别提供一行。这非常非常有效。

答案 1 :(得分:1)

您应该使用 headOption ,因为使用 head 不是一个好习惯。如果结果为空,它可能会破坏您的代码。

db.run(events (..filter/sort..) .take(1).result.headOption)