我有一个分区集合,它使用5位数的成员资格代码作为其分区键。集合中可能有数千个分区键。
我在其中插入了大约32K文件。使用Partition Stats
示例:
Summary:
partitions: 1
documentsCount: 32,190
documentsSize: 0.045 GB
但是只有一个物理分区!如果我使用门户网站指标,我会看到类似的事情:
这是不是意味着我的所有查询都针对单个物理分区? Cosmos何时添加更多物理分区?
我问的原因是因为我看到非常糟糕的性能,当我加载测试时严重恶化。例如,这个简单的计数方法在轻度测试中快速启动,然后在系统受压时需要几秒钟(忽略handler
个东西):
private async Task<int> RetrieveDigitalMembershipRefreshItemsCount(string code, string correlationId)
{
var error = "";
double cost = 0;
var handler = HandlersFactory.GetProfilerHandler(_loggerService, _settingService);
handler.Start(LOG_TAG, "RetrieveDigitalMembershipRefreshItemsCount", correlationId);
try
{
if (this._docDbClient == null)
throw new Exception("No singleton DocDb client!");
// Check to see if there is a URL
if (string.IsNullOrEmpty(_docDbDigitalMembershipsCollectionName))
throw new Exception("No Digital Memberships collection defined!");
FeedOptions queryOptions = new FeedOptions { MaxItemCount = 1, PartitionKey = new Microsoft.Azure.Documents.PartitionKey(code.ToUpper()) };
return await _docDbClient.CreateDocumentQuery<DigitalMembershipDeviceRegistrationItem>(
UriFactory.CreateDocumentCollectionUri(_docDbDatabaseName, _docDbDigitalMembershipsCollectionName), queryOptions)
.Where(e => e.CollectionType == DigitalMembershipCollectionTypes.RefreshItem && e.Code.ToUpper() == code.ToUpper())
.CountAsync();
}
catch (Exception ex)
{
error = ex.Message;
throw new Exception(error);
}
finally
{
handler.Stop(error, cost, new
{
Code = code
});
}
}
以下是此方法的日志,因为测试按最高持续时间排序。最初它只需要几毫秒:
我尝试了大多数性能提示,即直接模式,相同区域,单例。任何帮助将非常感激。
感谢。
答案 0 :(得分:0)
分区密钥用于逻辑分区,跨物理分区分发数据。物理分区管理由Azure Cosmos DB管理。
只要初始容器创建的吞吐量至少为1000 RU / s且指定了分区键,就可以实现物理分区的自动拆分。拆分主要将一个物理分区中的逻辑分区分配给不同的物理分区。这个过程对我们来说是透明的。
物理分区的两种情况:
",
达到其存储限制,Azure Cosmos DB将p
无缝拆分为两个新的物理分区。如果p
内部只有一个逻辑分区,则拆分不会发生。因此,如果不满足这些条件,则只有一个物理分区。但是查询是使用分区键对指定的逻辑分区进行的。
有关详细信息,请参阅Azure Cosmos DB partition。