繁体   English   中英

ArangoDB:数组元素中的性能指标

[英]ArangoDB: performance index in array element

我在 ArangoDB 中有一个集合,其中填充了这样的元素:

{

  "id": "XXXXXXXX",
  "relation": [
    {
      "AAAAA": "AAAAA",
    },
    {
      "BBBB": "BBBBBB",
      "field": {
        "v1": 0,
        "v2": 0,
        "v3": 0
      }
    },
    {
      "CCCC": "CCCC",
      "field": {
        "v1": 0,
        "v2": 1,
        "v3": 2
      }
    },
  ]
}

我只想返回field.v1 > 0 (或 v 值的组合)的元素。 我曾尝试编写一个像这样的 AQL 查询,但它不使用索引,而且使用 200000+ 个元素时速度太慢。

FOR a in X
    FILTER LENGTH(a.relation) > 0
    LET relation =  a.relation
    FOR r in relation
        FILTER r.field > null 
        FILTER r.field.v1 > 0
return a

我试图创建这些索引:

  • full text on relation[*]field
  • skip list on relation[*]field
  • hash on relation[*]field但没有结果。

我能做什么? 你能建议我对查询进行任何更改吗?

谢谢。

此致,

丹尼尔

我建议进行以下更改,但它们不会显着加快查询速度:

  • 过滤器FILTER r.field > nullFILTER r.field.v1 > 0是多余的。 您可以只使用后者FILTER r.field.v1 > 0并省略其他过滤条件

  • 辅助变量LET relation = a.relation之后被定义a.relation在使用LENGTH(a.relation)计算。 如果辅助变量是在LENGTH()计算之前定义的,它可以像这样在其中使用: LET relation = a.relation FILTER LENGTH(relation) > 0 这将节省一些处理时间

  • 原始查询检查每个v1值,如果文档中的多个v1值满足过滤条件,则可能多次返回每个文档。 这意味着原始查询可能返回比集合中实际存在的文档更多的文档。 如果不需要,我建议使用子查询(见下文)

将上述修改应用于原始查询时,这就是我想出的:

FOR a IN X 
  LET relation = a.relation
  FILTER LENGTH(relation) > 0 
  LET s = (
    FOR r IN relation
      FILTER r.field.v1 > 0 
      LIMIT 1 
      RETURN 1
  )
  FILTER LENGTH(s) > 0 
  RETURN a

正如我所说,这可能不会大大提高性能,但是,您可能会从查询中得到不同的(可能是所需的)结果,即如果文档中的多个v1满足过滤条件,则文档会减少。

关于索引:全文和哈希索引在这里没有帮助,因为它们只支持相等比较,但查询的过滤条件大于. 一般而言,唯一在这里有益的索引类型是跳过列表索引。 但是,在 2.7 中根本不支持索引数组值,因此索引relation[*].field将无济于事,并且仍然不会像您报告的那样使用索引。

ArangoDB 2.8 将是第一个支持索引单个数组值的版本,您可以在该版本上创建一个关于relation[*].field.v1

2.8 中的查询仍然不会使用该索引,因为数组索引仅用于IN比较运算符。 它们不能与查询中的>一起使用。 此外,当将过滤条件编写为FILTER r[*].field.v1 > 0 ,对于上面的示例文档,这将评估为FILTER [null, 0, 0] > 0 ,这不会产生所需的结果。

在这里可以提供帮助的是比较运算符修饰符(工作标题),它可以告诉运算符<<=>>===!=对其左操作数的所有成员运行比较。 可以有ALLANY修改,因此过滤条件可以简单地写为FILTER a.relation[*].field.v1 ANY > 0 但请注意,这还不是现有功能,而只是我关于将来如何解决此问题的快速草稿。

全文索引目前只能与FULLTEXT() 函数一起使用

目前无法使用索引来确定子对象的长度。 一旦它们成为现实,这将是使用函数定义的索引可以解决的事情。

现在获得可用性能的唯一方法是在将文档写入集合时记住另一个属性的长度:

{
  "id": "XXXXXXXX",
  "length": 6,
  "relation": [
    {
      "AAAAA": "AAAAA",
    },
    {
      "BBBB": "BBBBBB",
      "field": {
        "v1": 0,
        "v2": 0,
        "v3": 0
      }
    },
    {
      "CCCC": "CCCC",
      "field": {
        "v1": 0,
        "v2": 1,
        "v3": 2
      }
    },
  ]
}

<Clippy>你看起来想在你的数据布局中使用图形功能? </Clippy>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM