Mar*_*dad 5 azure azure-cosmosdb
我有一个16GB的集合,有2个分区.当我通过它的Id查询文档时,它非常慢.但是通过索引字段进行查询的速度很快.两者都是跨分区查询,如果我使用查询传递分区键,它很快但分区键并不总是可用于我的查询.在Azure门户中使用.NET SDK和文档资源管理器查询得到了类似的结果.
该集合具有自定义索引策略,但据我所知您不需要索引Id
,甚至可能不可能.
以下是我的查询及其相应的请求费用.
SELECT * FROM c where c.id = 'unique-id-123'
-- Request Charge: 344940.79 RUs, Document Count: 1
SELECT * FROM c WHERE c.otherId = 'NOT-so-uniqueId-123'
-- Request Charge: 5.08 RUs, Document Count: 3
Run Code Online (Sandbox Code Playgroud)
如您所知,Id是唯一的,因此查询返回1个文档,而第二个查询被过滤otherId
不是那么唯一并返回3个文档.还要注意第一个查询的RU消耗量非常高.
那么为什么第二个查询比Id要快?
更新:
以下是上述查询的已收集指标.
按ID查询:
Read 1 records in 1497 ms, 339173.109 RU, Size: 6873022 KB
QueryPreparationTime(ms): CompileTime = 2, LogicalBuildTime = 0,
PhysicalPlanBuildTime = 0, OptimizationTime = 0
QueryEngineTime(ms): DocumentLoadTime = 1126, IndexLookupTime = 0,
RuntimeExecutionTimes = 356, WriteOutputTime = 0
Run Code Online (Sandbox Code Playgroud)
按索引字段查询:
Read 4 records in 2 ms, 7.56 RU, Size: 9 KB
QueryPreparationTime(ms): CompileTime = 0, LogicalBuildTime = 0,
PhysicalPlanBuildTime = 0, OptimizationTime = 0
QueryEngineTime(ms): DocumentLoadTime = 0, IndexLookupTime = 1,
RuntimeExecutionTimes = 0, WriteOutputTime = 0
Run Code Online (Sandbox Code Playgroud)
这些证明Id的查询正在进行表扫描,因为大部分时间花费来自DocumentLoadTime
且没有值IndexLookupTime
.
但我认为Id应该是主键,默认情况下根据@ andrew-liu的回答进行索引.
微软支持得到了回复,他们已经解决了这个问题.他们IndexVersion
为这个系列添加了2个.不幸的是,门户网站尚未提供它,新创建的帐户/集合仍未使用新版本.您必须与Microsoft支持部门联系以更改您的帐户.
以下是索引版本2的集合的新结果,并且有了很大的改进.
SELECT * FROM c where c.id = 'uniqueValue'
-- Index Version 1: Request Charge: 344,940.79 RUs
-- Index Version 2: Request Charge: 3.31 RUs
SELECT * FROM c WHERE c.indexedField = 'value' AND c.id = 'uniqueValue'
-- Index Version 1: Request Charge: 150,666.22 RUs
-- Index Version 2: Request Charge: 5.65 RUs
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1118 次 |
最近记录: |