我经常在查询CosmosDB特定文档时执行LINQ谓词。但是,今天我用10万个以上的文档填满了我的CosmosDB,性能非常慢。由于Azure门户中的SQL查询明显更快,因此我尝试使用SqlQuerySpec。哇!它运行得更快。
有人能告诉我使用CosmosDB的Linq谓词时发生了什么,并且为什么会减慢我的查询吗?
以下代码用于获取文档的方法。 注意:在这种情况下,id是分区键。
var collectionUri = UriFactory.CreateDocumentCollectionUri(CDBdatabase, CDBcollection);
var sqlStatement = new SqlQuerySpec
{
QueryText = "SELECT * FROM c where c.id = @id",
Parameters = new SqlParameterCollection()
{
new SqlParameter("@id", consumerId),
},
};
IDocumentQuery<T> query = documentClient.CreateDocumentQuery<T>(
collectionUri,
sqlStatement,
.AsDocumentQuery();
List<ConsumerDetails> results = new List<ConsumerDetails>();
while (query.HasMoreResults)
{
results.AddRange(await query.ExecuteNextAsync<ConsumerDetails>());
}
return results.FirstOrDefault();
相比之下,速度较慢的代码:
return documentClient.CreateDocumentQuery<ConsumerDetails>(
collectionUri,
.Where(f => f.Id == consumerId).AsEnumerable().FirstOrDefault();
ReadDocument()
比查询更快,始终如一(例如,对于 1KB 文档,需要 1 RU),因为它不需要经过查询引擎。 - David Makogon.AsDocumentQuery
和ExecuteNextAsync
操作? - Nick Chapsas