Azure cosmosdb FeedOption中的MaxItemCount和QueryMetric中的RetrieveDocumentCount在Cosmos DB中是如何工作的?为什么两者都不匹配?
我目前面临Cosmos DB的查询性能问题,我确信我已经遵循了Microsoft页面中的大多数性能提示,但查询仍然需要>1秒的时间 连接策略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,
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显示不同的否(主要是一个集合中的文档总数)。是因为我的查询吗?是的,这个查询总共检索了这么多文档。您可以在这里阅读更多信息