Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.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 使用分页时的Documentdb性能_Azure_Pagination_Azure Cosmosdb - Fatal编程技术网

Azure 使用分页时的Documentdb性能

Azure 使用分页时的Documentdb性能,azure,pagination,azure-cosmosdb,Azure,Pagination,Azure Cosmosdb,我有一个关于分页的工作代码,它非常适合azure搜索和sql,但是当在documentdb上使用它时,加载最多需要60秒 我们认为这是一个延迟问题,但我找不到解决方法来加快它 有关于从哪里开始寻找的文档或想法吗 public PagedList(IQueryable<T> superset, int pageNumber, int pageSize, string sortExpression = null) { if (pageNumber <

我有一个关于分页的工作代码,它非常适合azure搜索和sql,但是当在documentdb上使用它时,加载最多需要60秒

我们认为这是一个延迟问题,但我找不到解决方法来加快它

有关于从哪里开始寻找的文档或想法吗

    public PagedList(IQueryable<T> superset, int pageNumber, int pageSize, string sortExpression = null)
    {
        if (pageNumber < 1)
            throw new ArgumentOutOfRangeException("pageNumber", pageNumber, "PageNumber cannot be below 1.");
        if (pageSize < 1)
            throw new ArgumentOutOfRangeException("pageSize", pageSize, "PageSize cannot be less than 1.");


        // set source to blank list if superset is null to prevent exceptions
        TotalItemCount = superset == null ? 0 : superset.Count();
        if (superset != null && TotalItemCount > 0)
        {
            Subset.AddRange(pageNumber == 1
                ? superset.Skip(0).Take(pageSize).ToList()
                : superset.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList()
            );
        }
    }
publicpagedlist(IQueryable超集、int pageNumber、int pageSize、string sortExpression=null)
{
如果(页码<1)
抛出新ArgumentOutOfRangeException(“pageNumber”,pageNumber,“pageNumber不能低于1”);
如果(页面大小<1)
抛出新ArgumentOutOfRangeException(“pageSize”,pageSize,“pageSize不能小于1”);
//如果超集为空,则将源设置为空列表以防止异常
TotalItemCount=superset==null?0:superset.Count();
如果(超集!=null&&TotalItemCount>0)
{
Subset.AddRange(页码==1
?超集.Skip(0).Take(pageSize).ToList()
:superset.Skip((页码-1)*pageSize.Take(页面大小).ToList()
);
}
}

虽然DocumentDB的LINQ提供程序在某些情况下会将.Take()转换为“TOP”SQL子句,但DocumentDB没有等效的Skip。所以,我有点惊讶它能工作,但我怀疑提供者正在从头开始重新运行查询以模拟跳过。评论中有一位DocumentDB产品经理领导的讨论,讨论他们为什么选择不实施SKIP。tl;博士它不适用于NoSQL数据库。我可以向MongoDB确认这一点(它确实具有跳过功能)。以后的页面只需扫描并扔掉以前的文档。你在列表中走得越晚,速度就越慢。我怀疑LINQ实现除了客户端之外正在做类似的事情

DocumentDB确实有一种将文档分块获取的机制,但其工作原理与SKIP略有不同。它使用延续令牌。你甚至可以设置一个maxPageSize,但是不能保证你能找回这个数字


我建议您实现自己的客户端缓存,并使用相当大的maxPageSize。假设UI中的每个页面有10行,而缓存中当前有27行。如果用户选择第1页或第2页,则有足够的行来呈现已缓存数据的结果。如果用户选择第7页,那么您知道缓存中至少需要70行。使用最后一个延续标记获取更多内容,直到缓存中至少有70行,然后渲染第61-70行。另一方面,延续代币的使用寿命很长,因此您可以根据用户的输入在以后使用。

谢谢Larry,我们正在考虑迁移到cassandra或couchdatabase,我们预计每天在电子商务上的请求量将超过一百万,您对此有什么最喜欢的吗?(特别是订单和购物车)我是PaaS产品的超级粉丝。在与Cassandra、Coach(pre-Couchbase)和MongoDB构建解决方案后,我发现所有这些解决方案的运营负担都太高(尤其是MongoDB)。所以,我现在最喜欢的是DocumentDB。我特别喜欢用JavaScript编写ACID事务的能力。AWS和Google上有很好的no ops替代方案,如果与我一起工作的组织有偏好,我会使用它们,但没有一个比DocumentDB更适合我的心智模型,我会错过它。感谢你的见解,我们尝试了标记化,但它阻碍了我们的API,我读到他们正在更新json过滤器,但我们等不及了,我正在检查orientdb,看它是否能更好地执行。不知道“更新json过滤器”是什么意思。听起来很有趣。我不熟悉OrientDB,但很多.NET用户都选择RavenDB,我对它也没有第一手的了解。