在 Slick 中一次和多次调用 `run.db` 有什么不同吗

Are there any difference calling `run.db` once and multiple times in Slick

调用一次run.db有什么不同吗:

val dbAction3 = for {
  res1 <- dbAction1
  res2 <- dbAction2(res1)
} yield res2

val res3 = db.run(dbAction3)

多次:

val res3 = for {
  res1 <- db.run(dbAction1)
  res2 <- db.run(dbAction2(res1))
} yield res2

据我了解,除非我们在第一个中使用 transactionally,否则没有区别。

两者观察到的效果是一样的,只是执​​行方式不同。第一个版本创建一个传递给数据库的查询,而第二个版本创建两个单独的数据库查询。

如果两个操作之间有任何共性,第一个版本提供了更大的优化潜力。 (例如,如果两个操作使用相同的 tables/views)。一个好的数据库可能能够以单独查询无法实现的方式组合或重新排序操作以提高效率。

第二个版本会产生两个数据库操作的开销,并使用 Future 机制来序列化它们,而不是内部数据库机制,因此效率可能较低。

第一个版本没有缺点,而且执行效率可能更高,所以这是“更好”的选择。但它确实取决于特定的数据库实现,因此可能存在第二个版本更快的情况。