我在一个相当大的数据存储上遇到了一些性能问题。为了优化插入阶段,我们创建了一个文档存储而不是一个图形,实际上边缘创建性能太慢了。基本上现在我们有一个 A 类(大约 30M 文档),带有一个到 B 类(大约 500 个文档)的链接(比如字段 fieldL)。查询结构如下:
选择 A where field1='field1value' and field2='field2value' and field3>0 ... and fieldL in (select from B where ...)
我发现的第一个问题是:我在 where 条件下的 n 个属性上创建了 n 个索引,但是解释命令显示我 orient 只使用一个... https://github.com/orientechnologies/orientdb /issues/3626 所以我创建了一个复合索引,如果我执行一个只涉及索引的查询,比如说
select from A where field1='field1value' and field2='field2value' and field3>0 结果真的很快
问题是关于查询的第二部分,涉及 fieldL 和链接。我尝试过使用 [#rid,...] 语法,但它似乎表现不佳。
我还尝试使用不同的方法更改架构:B 类具有多个指向 A 类的链接,使用不同的查询模式(比如包含链接 fieldL1 的字段):
select * from (select expand(fieldL1) from B where ...) where field1='field1value' and field2='field2value' and field3>0
在这种情况下,子查询执行数据的某种分区,但不幸的是我们丢失了结果集上的索引,所以我们在第二个 where 子句(field1='field1value' and field2='field2value' and field3 >0)。
我的问题是:是否存在更好的查询模式来更快地执行此类查询?
非常感谢。
顺便说一句,在性能调整期间,对查询中涉及的文档进行计数似乎真的很尴尬。( https://github.com/orientechnologies/orientdb/issues/3462 )