我不知道這下面兩行是更有效的:在Slick中獲得單一結果的最有效方法是什麼?
db.run(events (..filter/sort..) .take(1).result.head)
或
db.run(events (..filter/sort..) .result.head)
,因爲我已經發現了。取來自slick.lifted.Query
and .head from slick.profile.BasicStreamingAction
我不知道這下面兩行是更有效的:在Slick中獲得單一結果的最有效方法是什麼?
db.run(events (..filter/sort..) .take(1).result.head)
或
db.run(events (..filter/sort..) .result.head)
,因爲我已經發現了。取來自slick.lifted.Query
and .head from slick.profile.BasicStreamingAction
下面的代碼,它使用take(1)
是有效的,因爲take(1)
轉化爲底層關係型數據庫生病,然後查詢優化SQL的功能優化挑只有結果的第一行。
db.run(events (..filter/sort..) .take(1).result.head)
但在僅.head
在應用層光滑情況下不會翻譯該代碼到SQL所以其不會傳遞到該基礎關係數據庫。沒有優化就完成了。當在應用程序級完成.head
時,將從關聯db返回的符合條件的行中選擇一行。在應用層排第一行顯然效率不高。
.take(1)
將轉換爲SQL查詢中的LIMIT 1
。
.head
確實在查詢應用層的結果之後給出結果集的第一個元素(結果集可能非常大,而且效率非常低,速度很慢)。
.take(1)
將僅在數據庫級別提供一行。這是非常非常有效的。
您應該使用headOption,因爲使用頭不是一個好習慣。如果結果爲空,它可能會吹你的代碼。
db.run(events (..filter/sort..) .take(1).result.headOption)