Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure cosmosdb FeedOption中的MaxItemCount和QueryMetric中的RetrieveDocumentCount在Cosmos DB中是如何工作的?为什么两者都不匹配?_Azure Cosmosdb - Fatal编程技术网

Azure cosmosdb FeedOption中的MaxItemCount和QueryMetric中的RetrieveDocumentCount在Cosmos DB中是如何工作的?为什么两者都不匹配?

Azure cosmosdb FeedOption中的MaxItemCount和QueryMetric中的RetrieveDocumentCount在Cosmos DB中是如何工作的?为什么两者都不匹配?,azure-cosmosdb,Azure Cosmosdb,我目前面临Cosmos DB的查询性能问题,我确信我已经遵循了Microsoft页面中的大多数性能提示,但查询仍然需要>1秒的时间 连接策略 private static readonly ConnectionPolicy ConnectionPolicy = new ConnectionPolicy { ConnectionMode = ConnectionMode.Direct, ConnectionProtocol = Protocol.Tcp,

我目前面临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();
FeedOptions=newfeedoptions
{
MaxItemCount=config.getSearchLimit,///即100
PartitionKey=新的PartitionKey(PartitionKey),
RequestContinuation=responseContinuation
};
var documentQuery=Client.CreateDocumentQuery(
此.TenantCollectionUri,
querySpec,
选项)。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
选择p.Doc.id、p.Doc.Name、p.Doc.isoorganization、p.Doc.organizationLegalName、p.Doc.isFactoryAutoUpdate、p.Doc.StartDate、p.Doc.EndDate、p.Doc.inactivevereasoncode、p.Doc.speciality.speciality allspeciality、p.Doc.Address中p加入地址的地址,其中(p.Doc.EndDate=null或(p.Doc.StartDate=@EndDate))包含(p.Doc.Name,@PROVIDERNAME)和地址。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
选择p.Doc.id、p.Doc.Name、p.Doc.isoorganization、p.Doc.organizationLegalName、p.Doc.isFactoryAutoUpdate、p.Doc.StartDate、p.Doc.EndDate、p.Doc.inactiveReverseasoncode、p.Doc.speciality.speciality allspeciality、p.Doc.Address中p加入地址的地址(p.Doc.EndDate=null或(p.Doc.StartDate=@EndDate))和STARTSWITH(Address.postalCode,@postalCode)和Address.alpha2Code=@alpha2Code
以上查询将根据用户搜索条件进行更改

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

试着理解这里的几点

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

我在这里做的是什么错误,以及如何将此查询性能提高到亚秒(首先,MaxItemCount并不意味着您将获得前100个文档

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

如果您想将结果限制在前100名,那么在LINQ中使用
。在使用
AsDocumentQuery
之前,请先使用
top
方法,或者在SQL中使用
top
关键字

就性能而言,它不好有三个原因

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

在这一点上,如果更改模式不是一个选项,我建议您阅读更多关于它的内容,并根据应用程序的查询要求对其进行优化。

我同意您的看法,MaxItemCount将返回多达100个文档,但我不确定为什么ReteriveDocumentCount显示不同的否(主要是一个集合中的文档总数)。是因为我的查询吗?是的,这个查询总共检索了这么多文档。您可以在这里阅读更多信息