【发布时间】:2021-06-06 21:59:21
【问题描述】:
我们正在使用配置了 120K RU 的 CosmosDB Graph API 实例。我们使用/partition_key 属性设置了一致的分区结构。
在使用 Gremlin 查询我们的图表时,我们注意到与其他查询相比,某些查询使用了不合理的大量 RU。查询本身是相同的,但对于 partition_key 值本身。
例如,以下查询花费 23.25 RU:
g.V().has('partition_key', 'xxx')
而具有不同 partition_key 值的同一查询需要 4.14 RU:
g.V().has('partition_key', 'yyy')
查看两个查询的.exectionProfile() 结果;它们看起来很相似。
花费 23.25 RU (xxx) 的昂贵查询:
[
{
"gremlin": "g.V().has('partition_key', 'xxx').executionProfile()",
"activityId": "ec181c9d-59a1-4849-9c08-111d6b465b88",
"totalTime": 12,
"totalResourceUsage": 19.8,
"metrics": [
{
"name": "GetVertices",
"time": 12.324,
"stepResourceUsage": 19.8,
"annotations": {
"percentTime": 98.78,
"percentResourceUsage": 100
},
"counts": {
"resultCount": 1
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 1,
"size": 848,
"storageCount": 1,
"storageSize": 791,
"time": 12.02,
"storeResourceUsage": 19.8
}
]
},
{
"name": "ProjectOperator",
"time": 0.15259999999999962,
"stepResourceUsage": 0,
"annotations": {
"percentTime": 1.22,
"percentResourceUsage": 0
},
"counts": {
"resultCount": 1
}
}
]
}
]
花费 4.14 RU (yyy) 的廉价查询:
[
{
"gremlin": "g.V().has('partition_key', 'yyy').executionProfile()",
"activityId": "841e1c37-471c-461e-b784-b53893a3c349",
"totalTime": 6,
"totalResourceUsage": 3.08,
"metrics": [
{
"name": "GetVertices",
"time": 5.7595,
"stepResourceUsage": 3.08,
"annotations": {
"percentTime": 98.71,
"percentResourceUsage": 100
},
"counts": {
"resultCount": 1
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 1,
"size": 862,
"storageCount": 1,
"storageSize": 805,
"time": 5.4,
"storeResourceUsage": 3.08
}
]
},
{
"name": "ProjectOperator",
"time": 0.07500000000000018,
"stepResourceUsage": 0,
"annotations": {
"percentTime": 1.29,
"percentResourceUsage": 0
},
"counts": {
"resultCount": 1
}
}
]
}
]
两个查询的结果都返回一个大小大致相同的顶点。
有人可以帮忙解释一下为什么会这样吗?为什么一个比另一个贵得多?关于 Cosmos DB 分区,我有什么不明白的地方吗?
编辑 1:
我们还通过添加其他查询参数进行了一些实验,例如id 和label。 id 子句确实将昂贵查询的成本从 ~23 RU 降低到 ~4.57 RU。这种方法的问题在于,通常它会降低所有其他查询的效率(即增加 RU)。
例如,其他查询(如此票证中的快速查询)从 ~4.14 RUs 变为 ~4.80 RUs,并添加了 id 子句。所以这并不是真正可行的,因为 99% 的查询会更糟。我们需要找到根本原因。
【问题讨论】:
-
您能否通过分区键对查询进行更多测试?最好的情况是你执行了 2 个查询,唯一的区别是分区键值,它们都有一个作为结果的项目,那么我们可以尝试找到数量关系。在我看来,我们现在可以得出的结论是,RU成本是基于查询结果的,正如你所说的“大小”有很大的差距。顺便说一句,RU 定义为:对 1 KB 项目进行点读取(即通过其 ID 和分区键值获取单个项目)的成本是 1 请求单位(或 1 RU)
-
这个doc可能对先生有帮助。
-
先生,您有任何进展或进一步的测试吗?你很慷慨地分享你的情况:)
-
@Tiny-wa 我已经更新了最新发现...
-
您好,先生,您似乎想找到一种降低RU成本的方法,在我看来这等于提高性能,我向您推荐this doc,希望对您有所帮助。跨度>