我们正在存储文件夹树,由于项目数量巨大,因此我们在父文件夹上创建了一个分区。
当我们发出
之类的查询时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
答案 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));
}
迁移可能需要几个小时才能完成,具体取决于集合中的数据量。该问题一旦完成就应该得到解决。
(这是从电子邮件对话中粘贴的副本,我们必须解决此问题)