【发布时间】: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 接口中的计数?谢谢
-
只能使用您的一个索引。我们进行了一些成本计算(例如
=优于>),但您的过滤器似乎相等。在这种情况下,使用较旧的索引。也许您的 5.0 测试中使用了不同的顺序? -
你的回答让我有点困惑。 - 只有一个索引 -? - 你的意思是我们只能有排序或哈希索引 - 或者你的意思是当搜索时你只有一个索引,哪一个?为 Order by 或 First in Where 子句? - 这是什么意思:在这种情况下,使用较旧的索引。什么 ment the Older index ?请注意,查询在所有情况下都完全相同
标签: java performance hazelcast hazelcast-imap hazelcast-jet