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

Kla*_*503 3 scala slick

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

db.run(events (..filter/sort..) .take(1).result.head)
Run Code Online (Sandbox Code Playgroud)

要么

db.run(events (..filter/sort..) .result.head)
Run Code Online (Sandbox Code Playgroud)

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

.head来自slick.profile.BasicStreamingAction

pam*_*amu 7

下面使用的代码take(1)是高效的,因为take(1)转换为病态的SQL然后底层关系数据库的查询优化器进行优化以仅选择结果的第一行.

db.run(events (..filter/sort..) .take(1).result.head)
Run Code Online (Sandbox Code Playgroud)

但是,仅.head在应用程序层的情况下,slick不会将该代码转换为SQL,因此它不会传递给底层关系数据库.没有进行优化.当.head在应用程序级完成一行将从由关系分贝符合标准,其返回的行被选择.在app层排第一行显然效率不高.

.take(1)将转换为LIMIT 1SQL查询.

.head 在查询应用程序层的结果后,它会给出结果集的第一个元素(结果集可能非常大,而且效率非常低且非常慢).

.take(1)只会在数据库级别提供一行.它非常非常有效.


Arp*_*har 5

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

db.run(events (..filter/sort..) .take(1).result.headOption)
Run Code Online (Sandbox Code Playgroud)