0

我在一个相当大的数据存储上遇到了一些性能问题。为了优化插入阶段,我们创建了一个文档存储而不是一个图形,实际上边缘创建性能太慢了。基本上现在我们有一个 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 )

4

1 回答 1

0

如果您使用以下查询

select * from (select expand(fieldL1) from B where ...) where field1='field1value' and field2='field2value' and field3>0

它不使用索引,因为使用子查询和索引时似乎存在问题

有关更多信息,您可以查看此链接 https://groups.google.com/forum/#!topic/orient-database/7jWEGpkIzXQ

于 2016-01-20T11:32:54.087 回答