gpt4 book ai didi

c# - 如何加快 Raven DB 查询性能?

转载 作者:行者123 更新时间:2023-12-03 20:43:20 25 4
gpt4 key购买 nike

谁能帮我加快这个查询速度?我正在使用 RavenDB 3.5.8 并且以下查询需要相当长的时间(在第一次加载时尤其如此):

var query = session
.Query<Card>()
.Include(p => p.AuthorId)
.Include(p => p.CompanyId)
.Where(x => !x.Id.StartsWith("Archived"))
.Where(x => !x.IsDeleted);

do
{
var popStash = stashedResults != null && stashedResults.Count > 0;
if (popStash)
{
stashSkip = stashedResults.Count;
}

results = query
.Statistics(out stats)
.OrderByDescending(x => x.ModifiedAt)
.Skip(this.ServerPage * this.ServerPageSize)
.Take(this.ServerPageSize)
.Select(MapCard)
.Where(x => x.IsAuthorized)
.Skip(clientPage * command.PageSize)
.Take(command.PageSize - stashSkip)
.ToList();

if (popStash)
{
results = results.Union(stashedResults).ToList();
stashedResults.Clear();
}

if (results.Count < command.PageSize)
{
++this.ServerPage;
clientPage = 0;

if (results.Count > 0)
{
stashedResults = results;
}
}


} while (results.Count < command.PageSize &&
stats.TotalResults >= (this.ServerPage * this.ServerPageSize) + this.ServerPageSize);
我知道它远非完美,但请注意双 SkipTake是必要的,因为 RavenDB 默认不支持身份验证,所以我必须 Map每张卡片并添加 IsAuthorized使用以下代码段添加到它的字段:
IsAuthorized = session.Advanced.IsOperationAllowedOnDocument("Authorization/Users/" + user.Id, "Cards/View", card.Id).IsAllowed;
基本上发生的情况是,首先查询加载一堆卡片(实际上 ServerPageSize 定义了那里的卡片数量)而不考虑安全性,然后在应用安全性时 command.PageSize卡已加载。 (网页动态加载卡片 - 前 50 张卡片已加载,在查看这些卡片后,正在抓取另外 50 张卡片,依此类推..)。
有人可以给我提示如何提高我的代码的性能吗?

最佳答案

您应该能够使用流式支持以避免多次查询。
您也在查询否定的内容,最好先查询肯定的内容然后否定。
请注意,这意味着您正在运行一个非常昂贵的 SELECT N+1,对于每个结果,您都会得到一个查询。
为什么不使用授权捆绑查询过滤功能?
请参阅此处的文档:
https://ravendb.net/docs/article-page/3.5/Csharp/server/bundles/authorization#operations
您错过了对 SecureFor 的调用
您可以使用:

session.SecureFor("Authorization/Users/" + user.Id, "Cards/View");
现在 RavenDB 将做过滤服务器端。

关于c# - 如何加快 Raven DB 查询性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66424571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com