gpt4 book ai didi

c# - 宇宙数据库 : Linq vs SqlQuerySpec Performance when querying CosmosDB

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:13 25 4
gpt4 key购买 nike

在查询 CosmosDB 特定文档时,我经常执行 LINQ 谓词。然而,今天我的 CosmosDB 中填满了 10 万多个文档。表演非常缓慢。由于 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();

最佳答案

答案取决于您查询的方式。

您发布的两个代码段不相同。

为了使它们相同,第二个必须如下所示:

var collectionUri = UriFactory.CreateDocumentCollectionUri(CDBdatabase, CDBcollection);

var query = documentClient.CreateDocumentQuery<ConsumerDetails>(
collectionUri)
.Where(f => f.Id == consumerId)
.AsDocumentQuery();

List<ConsumerDetails> results = new List<ConsumerDetails>();
while (query.HasMoreResults)
{
results.AddRange(await query.ExecuteNextAsync<ConsumerDetails>());
}

return results.FirstOrDefault();

在这两种情况下,您将针对 CosmosDB 执行 SQL。然而,在 LINQ 情况下,LINQ 翻译器将启动将表达式转换为 SQL 查询。

此外,在 SQL 示例中,由于您直接指向小写的 id(即 CosmosDB id),它也是分区键,CosmosDB 将识别出并将查询从跨分区查询限制为特定分区查询,使其更快、更便宜。 .Where(f => f.Id == ConsumerId) (使用大写的 Id),一旦通过 LINQ 提供程序,将被转换为 SELECT * FROM c where c.Id = ConsumerId 除非有 JsonAttribute("id") 修饰 Id 属性。这意味着您需要在 FeedOptions 中为查询提供 PartitionKey 值。

关于c# - 宇宙数据库 : Linq vs SqlQuerySpec Performance when querying CosmosDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52081323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com