Slick的典型表现(版本3.1.1)

时间:2016-09-27 13:25:28

标签: performance slick slick-3.0

我有以下SQL查询:

select `sr_roleName`, `sr_id` from `db_security_role` where `sr_roleName` = 'admin'

它是通过以下Slick代码生成的:

RoleTable.filter(_.name === roleName).result.head

所以 - 它看起来非常简单(实际上你可能拥有最简单的东西,对吧?)。现在让我们看看以下结果(下面的日志):

[debug] s.c.QueryCompilerBenchmark - ------------------- Phase: Time ---------
[debug] s.c.QueryCompilerBenchmark -       assignUniqueSymbols:    0.257579 ms
[debug] s.c.QueryCompilerBenchmark -                inferTypes:    0.774230 ms
[debug] s.c.QueryCompilerBenchmark -              expandTables:   18.949290 ms
[debug] s.c.QueryCompilerBenchmark -           forceOuterBinds:    3.438698 ms
[debug] s.c.QueryCompilerBenchmark -         removeMappedTypes:    2.760705 ms
[debug] s.c.QueryCompilerBenchmark -                expandSums:    0.702326 ms
[debug] s.c.QueryCompilerBenchmark -         emulateOuterJoins:    1.025963 ms
[debug] s.c.QueryCompilerBenchmark -             expandRecords:    1.022323 ms
[debug] s.c.QueryCompilerBenchmark -        flattenProjections:   10.691557 ms
[debug] s.c.QueryCompilerBenchmark -              rewriteJoins:    0.790561 ms
[debug] s.c.QueryCompilerBenchmark -             verifySymbols:    4.421257 ms
[debug] s.c.QueryCompilerBenchmark -             relabelUnions:    1.511849 ms
[debug] s.c.QueryCompilerBenchmark -          createAggregates:    0.612787 ms
[debug] s.c.QueryCompilerBenchmark -           resolveZipJoins:    0.723972 ms
[debug] s.c.QueryCompilerBenchmark -          pruneProjections:    4.261886 ms
[debug] s.c.QueryCompilerBenchmark -           rewriteDistinct:    2.408857 ms
[debug] s.c.QueryCompilerBenchmark -    createResultSetMapping:    2.745822 ms
[debug] s.c.QueryCompilerBenchmark -            hoistClientOps:    7.755399 ms
[debug] s.c.QueryCompilerBenchmark -         reorderOperations:    1.650360 ms
[debug] s.c.QueryCompilerBenchmark -     mergeToComprehensions:   27.408578 ms
[debug] s.c.QueryCompilerBenchmark -            optimizeScalar:    1.784032 ms
[debug] s.c.QueryCompilerBenchmark -          removeFieldNames:   13.811206 ms
[debug] s.c.QueryCompilerBenchmark -                   codeGen:   20.328294 ms
[debug] s.c.QueryCompilerBenchmark -                     TOTAL:  129.837531 ms
[debug] s.j.J.statement - Preparing statement: select `sr_roleName`, `sr_id` from `db_security_role` where `sr_roleName` = 'admin'
[debug] s.j.J.benchmark - Execution of prepared statement took 425µs

正如您所见,实际查询执行成本(需要时间)约为425μs。可能 - 它在本地计算机/本地数据库上执行。然而对我来说非常奇怪的是:整个查询准备时间总共花费129.837531毫秒(这是实际查询执行时间的300倍)。

基本上我的问题是:

  • 这是Slick的典型性能特征吗?

  • 有什么明显我可能做错了吗?

感谢

2 个答案:

答案 0 :(得分:0)

似乎是合理的。每次执行参数化查询时,光滑都需要重新编译它。通过预编译此类查询可以避免这种情况。例如:

def findByRoleName(roleName: Rep[String]) = RoleTable.filter(_.name === roleName)

val findByRoleNameCompiled = Compiled(findByRoleName _)

val result = findByRoleNameCompiled("myRole").result.head

现在查询将只编译一次,您应该注意到性能的提高。这也适用于插入,更新和删除。有关详细信息,请参阅文档中的Compiled Queries

答案 1 :(得分:0)

@szeiger:Typical performance in Slick (ver. 3.1.1)

的评论实际上是正确的答案

大型查询准备时间只是由于JVM没有预热而导致的。在多次执行各种查询之后,准备下一个查询的速度要快得多。同样值得记住@Roman指出的查询编译(虽然这本质上并不是真正的问题)。

@szeiger在引用评论中的引用基本上是这个问题的最佳答案:

  

平均超过53次中低复杂度的查询,第一次运行得到183 ms,几十次运行得到14 ms