FeedOption中的MaxItemCount和QueryMetric中的RetrievedDocumentCount在Cosmos DB中如何工作,为什么两者始终不匹配?

时间:2018-09-16 08:39:09

标签: azure-cosmosdb

我目前正面临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)

1 个答案:

答案 0 :(得分:0)

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

这意味着<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gen="http://www.test.com/generic-operation-message"> <soapenv:Body> <gen:Dummy> <gen:Result> <gen:ErrorCode>0</gen:ErrorCode> <gen:ErrorDesc>success</gen:ErrorDesc> <gen:Severity>info</gen:Severity> </gen:Result> </gen:Dummy> </soapenv:Body> </soapenv:Envelope> 的每次迭代一次最多返回100个文档,但最多返回与此查询匹配的所有文档。

如果要将结果限制在前100位,则在LINQ中使用ExecuteNextAsync方法,然后再使用.Take(100);在SQL中,使用AsDocumentQuery关键字。

就性能而言,这是不好的,原因有三个。

  • 检查日期范围之间的记录
  • 您正在使用TOP函数。
  • 您正在加入

在这一点上,如果不能更改模式,我建议阅读更多有关Indexing的信息,并根据应用程序的查询要求对其进行优化。