我有以下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的典型性能特征吗?
有什么明显我可能做错了吗?
感谢
答案 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