2015-09-23 2 views
2

Я использую протекающий код для upsert списка itemsSlick 3 - upsert работает слишком медленно

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 для ускорения?

ответ

2

compiled queries (docs). AFAIK, Скомпилированные запросы для вставки доступны после slick 2.0.

Кроме того, чтобы вставить список, вы должны выполнить пакетную операцию, а не вставлять запись по одному.

Так, в Slick-3,0, для вставки, вы должны сделать:

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

Затем запустить другой запрос, чтобы получить сумму нужного столбца.

EDIT: Я не думаю, что slick поддерживает массовые инструкции insertOrUpdate. Если базовый db поддерживает массовый insertOrUpdate, самым быстрым подходом будет писать простой SQL. В противном случае скомпилированный запрос insertOrUpdate должен быть достаточно быстрым.

Код должен быть чем-то вроде

items.map(tblCompiled.insertOrUpdate) 
+1

насчет upsert? – sheh

Смежные вопросы