scala - Slick 3 - upsert 工作太慢

标签 scala slick

我使用流动代码 upsert列表items

case class Item(id: String, text: String)

class Items(tag: Tag) extends Table[Item](tag, "items"){
    ...
}

val tbl = TableQuery[Items]

def insertItems(items: List[Item]):Future[Int] = {
    val q = DBIO.sequence(items.map(tbl.insertOrUpdate).toSeq).map(_.sum)
    db.run(q)
}

对于 items长度为 2000 的列表,upsert需要大约 10 秒。它太长了...

我认为,大部分时间都需要编译查询。

我应该如何重写 insertItems用于加速吗?

最佳答案

使用 compiled queries ( docs )。 AFAIK,插入的编译查询在 slick 2.0 之后可用。

另外,要插入一个列表,您应该进行批量操作,而不是一条一条地插入一条记录。

因此,在 Slick-3.0 中,对于插入,您应该执行以下操作:

val tblCompiled = Compiled(TableQuery[Items])
tblCompiled ++= items

然后运行另一个查询以获取所需列的总和。

编辑:我不认为,slick 支持批量 insertOrUpdate 语句。如果底层数据库支持批量 insertOrUpdate,最快的方法是编写纯 SQL。否则编译 insertOrUpdate查询应该相当快。

代码应该是这样的
items.map(tblCompiled.insertOrUpdate)

关于scala - Slick 3 - upsert 工作太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32735520/

相关文章:

regex - Scala 按包含所有连字符的行拆分多行字符串

scala sbt 测试在多个项目上运行一次设置和清理命令

scala - 使用光滑的多个左连接?

scala - 如何通过 Play 2/TypeSafe Activator 使用 Slick 连接到 Oracle 11g 数据库?

mysql - Slick:返回具有自动增量 ID 的插入行

Scala - Slick - 为包装的选项获取 TypedType [T]

macos - 如何在Scala中读取网络流?

scala - 从函数的返回值中提取符号

scala - 拉皮条 scalaz 备忘录

mysql - MySQL : ClassNotFoundException on driver 的 Slick 2.1 代码生成器