簡體   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