【发布时间】:2021-08-12 07:30:53
【问题描述】:
我有一个 Cosmos DB,大约。 10GB 用于存储分析数据的数据。
型号如下:
{
"publisherID": "",
"managerID": "",
"mediaID": "",
"type": "",
"ip": "",
"userAgent": "",
"playerRes": "",
"title": "",
"playerName": "",
"videoTimeCode": 0,
"geo": {
"country": "",
"region": "",
"city": "",
"ll": []
},
"date": "",
"uuid": "",
"id": ""
}
我有时会遇到非常繁重的查询,因为已达到我的 RU 限制。在考虑提高我的 RU 限制之前,我想确保我的查询已经过优化。
我的所有查询都遵循以下模式:
SELECT c.id,c.date,c.uuid,c.type FROM c WHERE c.mediaID = "{ID}" AND (c.type = "Load OR c.type = "Progress" OR c.type = "Play") AND (c.date BETWEEN "2021-06-30T22:00:00.000Z" AND "2021-07-31T21:59:59.999Z")
所以在做了一些研究之后,我得出的结论是我可以拥有的最佳索引是:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/type/?"
},
{
"path": "/mediaID/?"
},
{
"path": "/date/?"
}
],
"excludedPaths": [
{
"path": "/*"
}
]
}
我得到了这个查询的以下统计数据:
Request Charge: 324.51000000000005 RUs
Showing Results: 1 - 100
Retrieved document count: 10024
Retrieved document size: 8597509 bytes
Output document count: 200
Output document size: 28324 bytes
Index hit document count: 199.24
Index lookup time: 2.41 ms
Document load time: 62.93 ms
Query engine execution time: 15.709800000000001 ms
System function execution time: 0 ms
User defined function execution time: 0 ms
Document write time: 0.47000000000000003 ms
Round Trips: 1
让我担心的是检索文档计数和输出文档计数之间的差异。我猜这就是为什么我需要 324 RU 才能获得前 100 个结果...
我不确定如何设置索引以优化查询性能(总是相同的模式:WHERE mediaID = {ID} AND type = {TYPE} AND date 2 个日期之间)
欢迎任何帮助。
【问题讨论】:
-
尝试创建
/mediaID、/type和date的复合索引,并在创建索引后再次运行查询。 -
考虑使用默认索引所有内容的退出策略,至少用于故障排除。这样您就可以排除您创建的策略的问题。 docs.microsoft.com/en-us/azure/cosmos-db/…
-
另外,你的分区键是什么?
-
@NoahStahl 虽然分区键对于扩展当然很重要,但我认为它对这个特定问题没有影响。只有 10GB 的数据将全部存储在单个物理分区中,因此跨分区查询没有影响。
标签: indexing nosql query-optimization azure-cosmosdb