带有索引的 Gemfire LIKE 查询
Gemfire LIKE Query with Indexes
我们有一个场景来评估 LIKE 搜索索引(范围)的键(限制为 100)。查询使用了索引,但是查询的性能根据 'key' returns.
的匹配数量而变化
即如果搜索更具体,查询需要更长的时间,如果搜索是通用的(并且有更多的结果)它 returns 更快(可能是因为它更快地获得前 100 个)。
对于具有 400k 记录的复制区域,结果从 1 毫秒到 5 分钟不等。
例如查询
select * 来自 /REGION,其中字段如“%SEARCH_STRING%”
有趣的是,开头的 % 导致了问题。如果我们只是删除它,它 returns 以毫秒为单位。在任何一种情况下,'indexesUsed' 都会返回正确的索引。
我们似乎遗漏了一些关于索引的基本内容,或者索引有一个奇怪的行为。
注意:Gemfire 版本:8.2.0,Spring-数据:1.8.5。直接在 gfsh 中查询也可以重现此问题。所以与spring-数据层无关。
前缀 % 导致您扫描 整个 索引。当您删除前缀 % 时,您实际上是在使用索引跳转到(范围索引的)起点并从那里开始扫描。
我在您的查询中注意到的另一件事是您正在使用 "select *"。您真的需要将整个记录序列化吗?如果您启用 PDX 并且仅 select 您需要的字段,您将获得更好的性能。
您报告说它正在使用索引,即使它正在有效地进行扫描。如果您没有启用 PDX 并且它确实没有使用索引,那么反序列化所有记录可能是一个问题(因为您有 select *)或者 JVM 由于扫描而限制内存。
韦斯·威廉姆斯
P.S。直接从开发人员那里获得帮助的一种有效方法是 postgeode 用户列表中的问题。
我们有一个场景来评估 LIKE 搜索索引(范围)的键(限制为 100)。查询使用了索引,但是查询的性能根据 'key' returns.
的匹配数量而变化即如果搜索更具体,查询需要更长的时间,如果搜索是通用的(并且有更多的结果)它 returns 更快(可能是因为它更快地获得前 100 个)。 对于具有 400k 记录的复制区域,结果从 1 毫秒到 5 分钟不等。 例如查询 select * 来自 /REGION,其中字段如“%SEARCH_STRING%” 有趣的是,开头的 % 导致了问题。如果我们只是删除它,它 returns 以毫秒为单位。在任何一种情况下,'indexesUsed' 都会返回正确的索引。
我们似乎遗漏了一些关于索引的基本内容,或者索引有一个奇怪的行为。
注意:Gemfire 版本:8.2.0,Spring-数据:1.8.5。直接在 gfsh 中查询也可以重现此问题。所以与spring-数据层无关。
前缀 % 导致您扫描 整个 索引。当您删除前缀 % 时,您实际上是在使用索引跳转到(范围索引的)起点并从那里开始扫描。
我在您的查询中注意到的另一件事是您正在使用 "select *"。您真的需要将整个记录序列化吗?如果您启用 PDX 并且仅 select 您需要的字段,您将获得更好的性能。
您报告说它正在使用索引,即使它正在有效地进行扫描。如果您没有启用 PDX 并且它确实没有使用索引,那么反序列化所有记录可能是一个问题(因为您有 select *)或者 JVM 由于扫描而限制内存。
韦斯·威廉姆斯
P.S。直接从开发人员那里获得帮助的一种有效方法是 postgeode 用户列表中的问题。