我目前正面临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秒。
试图在这里理解几点
我在做什么错了,如何将查询性能提高到亚秒级(<.5s)
答案 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的信息,并根据应用程序的查询要求对其进行优化。