来自QueryMetric的FeedOption和RetrievedDocumentCount的MaxItemCount如何在Cosmos DB中工作以及为什么两者都不匹配?

问题描述 投票:0回答:1

我目前面临与Cosmos DB的查询性能问题,我很确定我已经关注了Microsoft页面的大部分性能提示,但仍然查询需要> 1秒。

连接政策

private static readonly ConnectionPolicy ConnectionPolicy = new ConnectionPolicy
    {
        ConnectionMode = ConnectionMode.Direct,
        ConnectionProtocol = Protocol.Tcp,
        RequestTimeout = new TimeSpan(1, 0, 0),
        MaxConnectionLimit = 1000,
        RetryOptions = new RetryOptions
        {
            MaxRetryAttemptsOnThrottledRequests = 10,
            MaxRetryWaitTimeInSeconds = 60
        }
    };

文档客户端

this.Client = new DocumentClient(new Uri(config.DocumentDBURI), config.DocumentDBKey, ConnectionPolicy);

文档查询

FeedOptions options = new FeedOptions
                {
                    MaxItemCount = config.getSearchLimit,//// which is 100
                    PartitionKey = new PartitionKey(partitionKey),
                    RequestContinuation = responseContinuation
                };

                var documentQuery = Client.CreateDocumentQuery<SearchByAttributesResult>(
                    this.TenantCollectionUri,
                    querySpec,
                    options).AsDocumentQuery();

查询1

SELECT p.Doc.id, p.Doc.Name, p.Doc.isOrganization,p.Doc.organizationLegalName, p.Doc.isFactoryAutoUpdate,p.Doc.StartDate, p.Doc.EndDate, p.Doc.InactiveReasonCode,p.Doc.Specialty.specialty AllSpecialty, Address from p JOIN Address IN p.Doc.Address.address  WHERE  (p.Doc.EndDate = null or (p.Doc.StartDate <= @STARTDATE and p.Doc.EndDate >= @ENDDATE)) and  CONTAINS(p.Doc.Name, @PROVIDERNAME) and  Address.alpha2Code= @ALPHA2CODE

查询2

    SELECT p.Doc.id, p.Doc.Name, p.Doc.isOrganization,p.Doc.organizationLegalName, p.Doc.isFactoryAutoUpdate,p.Doc.StartDate, p.Doc.EndDate, p.Doc.InactiveReasonCode,p.Doc.Specialty.specialty AllSpecialty, Address from p JOIN Address IN p.Doc.Address.address  WHERE  (p.Doc.EndDate = null or (p.Doc.StartDate <= @STARTDATE and p.Doc.EndDate >= @ENDDATE)) and  STARTSWITH(Address.postalCode, @POSTALCODE) and  Address.alpha2Code= @ALPHA2CODE

以上查询根据用户搜索条件进行更改

我的收藏中只有900个文档,但查询总是需要> 1秒。

试图了解这里的几点

  • 虽然我将MaxItemCount设置为100,但为什么我将QueryMetrics中的RetrievedDocumentCount视为900?
  • 使用CONTAINS / STARTSWITH导致此性能问题?

我在这里做错了什么,如何将查询性能提高到亚秒(<.5s)

azure-cosmosdb
1个回答
0
投票

首先,MaxItemCount并不意味着您将获得前100个文档。

这意味着ExecuteNextAsync的每次迭代一次最多可返回100个文档,但最多可返回与此查询匹配的所有内容。

如果要将结果限制在前100,那么在LINQ中使用.Take(100)方法在使用AsDocumentQuery之前或在SQL中使用TOP关键字。

在性能方面,这有三个原因。

  • 检查日期范围之间的记录
  • 您正在使用CONTAINS/STARTSWITH功能。
  • 你加入了

此时,如果不能更改架构,我建议您阅读有关Indexing的更多信息并根据应用程序的查询要求对其进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.