【问题标题】:CQEngine query overhead / precompiled parameterized queriesCQEngine 查询开销/预编译参数化查询
【发布时间】:2021-02-12 09:35:42
【问题描述】:

当我多次查询一个索引集合,查询都是一样的,只是属性值不同,执行的开销有多大?

有没有办法预编译参数化查询以消除这种开销?

编辑:这是一个简单的基准测试,显示从具有哈希索引的 CQEngine 集合中进行多次检索往往比从 LinkedHashMap 中检索项目慢约 18 倍。

https://github.com/Inego/cqe-simple-benchmark/blob/main/src/main/kotlin/Benchmark.kt

【问题讨论】:

    标签: cqengine


    【解决方案1】:

    本身不支持参数化查询。

    但是,如果您想减少频繁构建查询的开销,例如对垃圾收集的影响,您可以利用查询不可变和无状态这一事实,并缓存经常使用的查询。

    查询是树。因此,您还可以缓存经常使用的查询分支,并在从缓存中检索分支的情况下动态重组查询树。

    不过话虽如此,通常构造查询的开销应该很小。我建议您对您的应用程序进行基准测试,看看这是否真的值得。

    【讨论】:

    • 我已经编辑了我的问题以添加一个指向简单基准的链接,该基准表明从哈希索引中检索多个“等于”比从 LinkedHashMap 中“检索”慢大约 18 倍。
    • 那些在性能上永远不会相等。它对您的应用程序的延迟有可衡量的影响吗?这比以纳秒为单位测量的速度慢 18 倍,对吧?哈希查找通常比通过 CQEngine 查找哈希索引更快。部分原因是 CQEngine 是潜在的许多不同数据结构之上的一层,并且会尝试计算查询计划以访问数据结构(这会消耗一些 CPU 周期)。部分原因是您发现,构建查询树确实有一些开销。
    • 真的!我们使用 CQEngine 是为了能够进行任意查询。但是当我们使用相同的索引集合通过唯一字段快速查找项目时,我们也有这种极端情况,其中“查询计划”实际上是相同的,即“查找支持集合的哈希映射”。您如何看待通过 API 获取/缓存/重用 CQEngine 查询计划的可能性?
    猜你喜欢
    • 2015-07-03
    • 2018-05-06
    • 2017-08-31
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多