【发布时间】:2018-08-29 15:37:24
【问题描述】:
在查询 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();
【问题讨论】:
-
与您的问题稍微无关,但是,如果您真的是通过文档的 id 查询,那么
ReadDocument()总是比查询快(例如,1 RU 用于 1KB 文档),因为它不需要经过查询引擎。 -
您可以在从 LINQ 链获得的 IQueryable 上调用 ToString() 并检查手动构建的查询与来自 CosomsDB linq 提供程序的查询之间的区别。
-
好吧,有几件事缺少给出一个好的答案。你能发布你的
ConsumerDetailsDTO 的样子吗?您是否尝试在 LINQ 方法中将分区键值作为FeedOptions对象的一部分提供?您是否尝试在 linq 查询上执行.AsDocumentQuery和ExecuteNextAsync?
标签: c# linq azure azure-cosmosdb