gpt4 book ai didi

azure-cosmosdb - 了解 fold() 及其对 Azure Cosmos DB 中 gremlin 查询成本的影响

转载 作者:行者123 更新时间:2023-12-04 06:45:16 26 4
gpt4 key购买 nike

我正在尝试了解 Azure Cosmos DB 中的查询成本

我无法弄清楚以下示例中有什么区别以及为什么使用 fold() 会降低成本:

g.V().hasLabel('item').project('itemId', 'id').by('itemId').by('id')

产生以下输出:
[
{
"itemId": 14,
"id": "186de1fb-eaaf-4cc2-b32b-de8d7be289bb"
},
{
"itemId": 5,
"id": "361753f5-7d18-4a43-bb1d-cea21c489f2e"
},
{
"itemId": 6,
"id": "1c0840ee-07eb-4a1e-86f3-abba28998cd1"
},
....
{
"itemId": 5088,
"id": "2ed1871d-c0e1-4b38-b5e0-78087a5a75fc"
}
]

成本为 15642 RU x 0.00008 $/RU = 1.25 $
g.V().hasLabel('item').project('itemId', 'id').by('itemId').by('id').fold()

产生以下输出:
[
[
{
"itemId": 14,
"id": "186de1fb-eaaf-4cc2-b32b-de8d7be289bb"
},
{
"itemId": 5,
"id": "361753f5-7d18-4a43-bb1d-cea21c489f2e"
},
{
"itemId": 6,
"id": "1c0840ee-07eb-4a1e-86f3-abba28998cd1"
},
...
{
"itemId": 5088,
"id": "2ed1871d-c0e1-4b38-b5e0-78087a5a75fc"
}
]
]

成本为 787 RU x 0.00008$/RU = 0.06$
g.V().hasLabel('item').values('id', 'itemId')

具有以下输出:
[
"186de1fb-eaaf-4cc2-b32b-de8d7be289bb",
14,
"361753f5-7d18-4a43-bb1d-cea21c489f2e",
5,
"1c0840ee-07eb-4a1e-86f3-abba28998cd1",
6,
...
"2ed1871d-c0e1-4b38-b5e0-78087a5a75fc",
5088
]

成本:10639 RU x 0.00008 $/RU = 0.85 $
g.V().hasLabel('item').values('id', 'itemId').fold()

具有以下输出:
[
[
"186de1fb-eaaf-4cc2-b32b-de8d7be289bb",
14,
"361753f5-7d18-4a43-bb1d-cea21c489f2e",
5,
"1c0840ee-07eb-4a1e-86f3-abba28998cd1",
6,
...
"2ed1871d-c0e1-4b38-b5e0-78087a5a75fc",
5088
]
]

成本为 724.27 RU x 0.00008 $/RU = 0.057$

如您所见,对成本的影响是巨大的。
这只是大约。 3200 个节点,属性很少。

我想了解为什么添加折叠变化如此之大。

最佳答案

我试图重现您的示例,但不幸的是结果相反(Cosmos 中有 500 个顶点):

g.V().hasLabel('test').values('id')

或者
g.V().hasLabel('test').project('id').by('id') 

分别给了
86.08 和 91.44 RU,而相同的查询后跟 fold() 步骤导致 585.06 和
590.43 俄罗斯卢布。

根据 TinkerPop documentation 的说法,我得到的这个结果似乎很好:

There are situations when the traversal stream needs a "barrier" to aggregate all the objects and emit a computation that is a function of the aggregate. The fold()-step (map) is one particular instance of this.



知道 Cosmos 对访问的对象数量和对这些获得的对象进行的计算(在这种特殊情况下为 fold)收取 RU 费用,因此 fold 的成本更高,正如预期的那样。

您可以尝试为您的遍历运行 executionProfile() 步骤,这可以帮助您调查您的案例。当我尝试:
g.V().hasLabel('test').values('id').executionProfile()

我得到了 fold() 的 2 个额外步骤(为简洁起见省略了输出的相同部分),这个 ProjectAggregation 是结果集从 500 映射到 1 的地方:
 ...
{
"name": "ProjectAggregation",
"time": 165,
"annotations": {
"percentTime": 8.2
},
"counts": {
"resultCount": 1
}
},
{
"name": "QueryDerivedTableOperator",
"time": 1,
"annotations": {
"percentTime": 0.05
},
"counts": {
"resultCount": 1
}
}
...

关于azure-cosmosdb - 了解 fold() 及其对 Azure Cosmos DB 中 gremlin 查询成本的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56056827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com