【问题标题】:Hazelcast SQL interface slow performance HZ 4.2.2 vs HZ 5.0.2Hazelcast SQL 接口性能慢 HZ 4.2.2 vs HZ 5.0.2
【发布时间】:2022-02-02 11:28:29
【问题描述】:

情况:

  • 我们的产品有大约 30 个属性(字符串、枚举、双精度) 价值观
  • 我们的 iMap 包含所有属性 IndexType.HASH 的索引 字符串值和 IndexType.SORTED 用于双精度值。 (共 900MB)
  • 我们在地图中有 300k 产品。(大约 500MB)
  • 我们使用本地 Datagrid 和一个成员
  • JVM 配置:-Xms6G -Xmx8G
  • 对于 HZ 5:我们启用了 JetConfig
    config.getJetConfig().setEnabled(true);
  • 使用 Java AdoptOpenJDK 11.0.8

在 HZ4 中使用分页调用 SQL 查询时,我们大约在 20-50 毫秒内得到响应,但在 Hazelcast 5 中相同的查询我们在 2000-2500 毫秒内得到结果

...ORDER BY param1  ASC LIMIT  20 OFFSET  0... 
SqlResult sqlRows = hazelcastInstance.getSql().execute(sqlBuilder.toString());                                                                                           

当我们尝试在同一张地图上使用谓词时,在 HZ4 和 HZ5 中,我们在大约 2000-2500 毫秒得到了相同的结果来获得谓词页面

PagingPredicate<Long, Product> pagingPredicate = Predicates.pagingPredicate(predicate, ProductComparatorFactory.getEntryComparator(sortName), max);
pagingPredicate.setPage(from / max);
///get final list of products
List<Product> selectedPageA = new ArrayList<>(productMap.getAll(productMap.keySet(pagingPredicate)).values());

对于 HZ 5,我们添加映射

hazelcastInstance.getSql().execute("CREATE MAPPING "ProductScreenerRepositoryProductMap" EXTERNAL NAME "ProductScreenerRepositoryProductMap"
TYPE IMap
OPTIONS (
  'keyFormat' = 'java',
  'keyJavaClass' = 'java.lang.Long',
  'valueFormat' = 'java',
  'valueJavaClass' = 'com.finmason.finriver.product.Product'
)");
}

有使用SQL

 SELECT * FROM ProductScreenerRepositoryProductMap 
 WHERE doubleValue1 >= -0.9624378795139998 
 AND doubleValue1 <= 0.9727269574354098 
 AND doubleValue2 >= -0.9 
 AND doubleValue2 <= 0.9 
 ORDER BY doubleValue3  ASC LIMIT  20 OFFSET  0

而Product使用简单的序列化

【问题讨论】:

  • 您能否附上带有选定列的完整 sql 查询? com.finmason.finriver.product.Product 类中使用了什么样的序列化?是不是简单的Java序列化?
  • 我添加了使用的 SQL,它在 HZ 4 中很快,在 HZ 5 中很慢
  • 也许还有一个关于计数的问题。我们尝试切换到 HZ 5,因为我们需要在 HZ 5 中实现的计数功能。HZ5 是否有任何解决方法来获取 SQL 接口中的计数?谢谢
  • 只能使用您的一个索引。我们进行了一些成本计算(例如 = 优于 &gt;),但您的过滤器似乎相等。在这种情况下,使用较旧的索引。也许您的 5.0 测试中使用了不同的顺序?
  • 你的回答让我有点困惑。 - 只有一个索引 -? - 你的意思是我们只能有排序或哈希索引 - 或者你的意思是当搜索时你只有一个索引,哪一个?为 Order by 或 First in Where 子句? - 这是什么意思:在这种情况下,使用较旧的索引。什么 ment the Older index ?请注意,查询在所有情况下都完全相同

标签: java performance hazelcast hazelcast-imap hazelcast-jet


【解决方案1】:

实际上这种情况会比 5.1 加速 3 个独立的 PR:

有两种情况在 5.1 中没有解决,它们在 https://github.com/hazelcast/hazelcast/pull/20796 中描述 - 它不应该是 您的情况有问题,但是如果其他人看到此帖子,则可能是他/她。我希望修复将在 5.1.1 中提供。

如果您有可能在发布后升级到完整的 5.1,那么我强烈建议您这样做。

【讨论】:

    【解决方案2】:

    请升级到 Hazelcast 5.1(现在计划在 2 月 23 日发布)。 应该用https://github.com/hazelcast/hazelcast/pull/20681修复它

    【讨论】:

    猜你喜欢
    • 2012-05-19
    • 2017-02-27
    • 2020-10-27
    • 2019-01-14
    • 2021-05-19
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多