CosmosDb - 插入大量数据
CosmosDb - Insert a lot of data
我开发了一个用于在 MongoDb CosmosDb 数据库中插入大量数据的 azure webjob。
下面是我存储库中用于在 cosmosDb 数据库中插入数据的代码:
public async Task<bool> InsertZonierDataAsync(List<Zonier> zonierList)
{
if (zonierList == null || !zonierList.Any())
{
throw new ZonierListNullOrEmptyException();
}
try
{
await _retryPolicy.ExecuteAsync(async () =>
{
await _collection.InsertManyAsync(zonierList);
});
return true;
}
catch (MongoBulkWriteException ex)
{
throw new DataBaseWritingException(ex.Message, ExceptionCodeConstants.DataBaseWritingExceptionCode);
}
}
为了快速插入数据,我在工作运行期间将我的RU/sec更新为10K。
zonierList
中有大约 20 亿原始数据需要插入。
不幸的是,通过 webjob 插入数据需要花费很多时间(两个多小时)。当我直接在 CosmosDb 中检查吞吐量时,它不会在 10K 处被阻塞:
我做错了什么,为什么花了这么多时间?我可以通过配置更改某些内容还是应该更改插入数据的方式?
即使您已经为您的容器预配了 10k RU,Cosmos DB 也会将该数量平均分配给构成该容器的所有物理分区。如果您要插入的所有文档都具有相同的分区键值,那么它们将全部进入相同的逻辑分区和 return 物理分区。这意味着如果您的集合有 4 个物理分区,您将只使用您配置的 10k 中的 2.5k。数字相加。
我开发了一个用于在 MongoDb CosmosDb 数据库中插入大量数据的 azure webjob。
下面是我存储库中用于在 cosmosDb 数据库中插入数据的代码:
public async Task<bool> InsertZonierDataAsync(List<Zonier> zonierList)
{
if (zonierList == null || !zonierList.Any())
{
throw new ZonierListNullOrEmptyException();
}
try
{
await _retryPolicy.ExecuteAsync(async () =>
{
await _collection.InsertManyAsync(zonierList);
});
return true;
}
catch (MongoBulkWriteException ex)
{
throw new DataBaseWritingException(ex.Message, ExceptionCodeConstants.DataBaseWritingExceptionCode);
}
}
为了快速插入数据,我在工作运行期间将我的RU/sec更新为10K。
zonierList
中有大约 20 亿原始数据需要插入。
不幸的是,通过 webjob 插入数据需要花费很多时间(两个多小时)。当我直接在 CosmosDb 中检查吞吐量时,它不会在 10K 处被阻塞:
我做错了什么,为什么花了这么多时间?我可以通过配置更改某些内容还是应该更改插入数据的方式?
即使您已经为您的容器预配了 10k RU,Cosmos DB 也会将该数量平均分配给构成该容器的所有物理分区。如果您要插入的所有文档都具有相同的分区键值,那么它们将全部进入相同的逻辑分区和 return 物理分区。这意味着如果您的集合有 4 个物理分区,您将只使用您配置的 10k 中的 2.5k。数字相加。