我想知道以下哪两行更有效:
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
下面使用的代码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)只会在数据库级别提供一行.它非常非常有效.
您应该使用headOption ,因为使用head不是一个好的做法。如果结果为空,它可能会破坏您的代码。
db.run(events (..filter/sort..) .take(1).result.headOption)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |