CosmosDB,很长的索引也是分区键

时间:2019-02-01 12:45:30

标签: azure-cosmosdb

我们正在存储文件夹树,由于项目数量巨大,因此我们在父文件夹上创建了一个分区。

当我们发出

之类的查询时
SELECT * FROM root WHERE root.parentPath = "\\server\share\shortpath" AND root.isFile 

RU极低,性能非常好。

但是,当我们有很长的路要走时,例如

SELECT * FROM root WHERE root.parentPath = "\\server\share\a very\long\path\longer\than\this" AND root.isFile

RU上升到5000,性能下降。

parentPath可以很好地用作分区键,因为all查询在过滤器中包含此字段。

如果我向查询添加另一个子句,它也会变得非常快,例如,如果我执行类似and root.name = 'filename'的事情

这几乎就像是基于从其派生的哈希值扫描整个分区一样。

  

查询不返回任何数据

很好,因为有人在给定节点下寻找子文件夹,一旦深入,它就会变得非常缓慢。

查询指标

x-ms-documentdb-query-metrics: 

totalExecutionTimeInMs=1807.61;
queryCompileTimeInMs=0.08;
queryLogicalPlanBuildTimeInMs=0.04;
queryPhysicalPlanBuildTimeInMs=0.06;
queryOptimizationTimeInMs=0.01;
VMExecutionTimeInMs=1807.11;
indexLookupTimeInMs=0.65;
documentLoadTimeInMs=1247.08;
systemFunctionExecuteTimeInMs=0.00;
userFunctionExecuteTimeInMs=0.00;
retrievedDocumentCount=72554;
retrievedDocumentSize=59561577;
outputDocumentCount=0;
outputDocumentSize=49;
writeOutputTimeInMs=0.00;
indexUtilizationRatio=0.00

来自字符串

x-ms-documentdb-query-metrics: totalExecutionTimeInMs=1807.61;queryCompileTimeInMs=0.08;queryLogicalPlanBuildTimeInMs=0.04;queryPhysicalPlanBuildTimeInMs=0.06;queryOptimizationTimeInMs=0.01;VMExecutionTimeInMs=1807.11;indexLookupTimeInMs=0.65;documentLoadTimeInMs=1247.08;systemFunctionExecuteTimeInMs=0.00;userFunctionExecuteTimeInMs=0.00;retrievedDocumentCount=72554;retrievedDocumentSize=59561577;outputDocumentCount=0;outputDocumentSize=49;writeOutputTimeInMs=0.00;indexUtilizationRatio=0.00

1 个答案:

答案 0 :(得分:4)

这是由于索引v1中的路径长度限制。

在新的索引布局中,我们已将路径长度限制增加到更大的值,因此将集合迁移到新的布局将解决此问题并提供许多性能优势。

默认情况下,我们为新集合推出了新的索引布局。如果您可以重新创建当前集合并在那里迁移现有数据,那就太好了。否则,另一种方法是触发迁移过程,以将现有集合移动到新的索引布局。可以使用以下C#方法进行操作:

static async Task UpgradeCollectionToIndexV2Async(

        DocumentClient client,

        string databaseId,

        string collectionId)

    {

        DocumentCollection collection = (await client.ReadDocumentCollectionAsync(string.Format("/dbs/{0}/colls/{1}", databaseId, collectionId))).Resource;

        collection.SetPropertyValue("IndexVersion", 2);

        ResourceResponse<DocumentCollection> replacedCollection = await client.ReplaceDocumentCollectionAsync(collection);

        Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Upgraded indexing version for database {0}, collection {1} to v2", databaseId, collectionId));

    }

迁移可能需要几个小时才能完成,具体取决于集合中的数据量。该问题一旦完成就应该得到解决。

(这是从电子邮件对话中粘贴的副本,我们必须解决此问题)

相关问题