问题标签 [select-n-plus-1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
52 浏览

python - 如何在 django 中正确表示“仓库” - n+1 个问题

我正在学习 Django。我正在尝试制作一个用于管理由简单元素组成的仓库的应用程序:

涉及的模型是交易、物品、仓库和房屋。

models.py

item_list.html(对于通用 ListView,带有qs=Item.objects.all()):

现在我的问题是,我的count_remaining方法被查询集中的每个对象调用一次,当 item_list 中有很多项目时,显然会导致数据库命中呈指数级增长。

如果我必须有一个页面在模板中显示仓库中的剩余项目,我如何才能在不过多访问数据库的情况下进行此算术运算?

0 投票
2 回答
33 浏览

ruby-on-rails - 在 Rails 中查询 has_many 关系时不获取 N+1 的智能方法?

我有一个Movie模型和一个MovieStream模型。关系是 Movie has_manyMediaType(和 MediaType belongs_toMovie)。

MediaType 有两个属性“url_broken”(真/假)和“dvd”(真/假)。

在我看来,我有:

movie_item-部分我有(简化):

这(显然)会导致 N+1 个查询,但我看不到任何解决方法。是否有可能以某种方式以我可以同时获得streamsand的方式查询视图查询dvds

喜欢:

没有N+1?结尾

0 投票
0 回答
24 浏览

django - 当您无法使用 select_related 时,如何避免在 Django 中进行 n+1 查询?

这是我经常遇到的问题。假设我有三个模型:

如果我要遍历Course.objects.all()并打印Course对象,那将是一个 n+1 查询。这很容易通过使用解决select_related

问题是我必须记住select_related每次都使用。它也很丑陋,尤其是如果您在那里有另一个模型,例如CourseDetails.

一种解决方案是使用自定义管理器:

然后我可以使用Course.with_names.all(),不再需要select_related每次都添加。这有一个主要限制 - 我只能在直接使用Course. 很多时候我会通过外键迭代Course对象,并且我需要再次记住select_related在我的代码中使用和乱扔它。一个例子:

现在如果我想打印所有学生和他们注册的课程,我必须再次记住使用select_related它甚至更丑:

我可以创建另一个经理,StudentCourseEnroll但这似乎违背了 DRY 原则——我会让多个经理做同样的事情。

有没有更好的方法来解决这个问题?我可以直接在Course模型中做些什么来避免考虑这个问题吗?

0 投票
1 回答
5 浏览

ruby-on-rails - 在一个小节的一个急切的小节中寻找一个属性,而不引起 SQL 调用?

我有一组如下所示的模型(此处显示的实际设置是一个简化的模型):

我像这样遍历它们:

在' blog_item'部分视图中,我想确定特定的贡献者(id:123,名称:“john”)是否包含在posts. 作为一个一般问题,这很容易,但我想在没有 SQL 调用的情况下执行此操作(导致 N+1)。

目前,我正在解决这个问题:

这会导致 SQL 调用(以及随后的 N+1)。

我不能做这样的事情:

那么,如何在没有额外的 SQL 调用的情况下解决这个问题呢?

0 投票
2 回答
100 浏览

mysql - LEFT JOIN FETCH 不能解决 n+1 问题

我想询问 N+1 问题的解决方案。我有具有 1:M 关系的 Account 表和 Account_role 表。我通过在@Query 中使用 LEFT JOIN FETCH 尝试连接获取方法,但不起作用。

账户类:

帐户角色类:

帐户存储库类

输出

0 投票
0 回答
60 浏览

ruby-on-rails - 如何在大量记录上优化和加速 .find 和 .build?

我有一个表格,它在 3 周内(总共 504 个 1 小时时隙)接受一天中每个小时的真/假值。

我正在尝试减少加载此页面所需的时间(目前在本地为 3 秒,但在 heroku 上为 15 秒;是网站上任何其他页面时间的两倍多)。

编码

表格如下所示:

少量i会很好,但因为它发生了 504 次,所以它很慢。

当我查看服务器日志时,它出现了一个 n+1 问题(我认为这可能是由 引起的@physician.availabilities.find)。但我不确定在保持功能的同时是否可以成功避免这种情况。

问题

如何在保留功能的同时加快页面加载速度?

其他注意事项

  • 网站上的每个页面都在 7 秒内加载,所以这个页面是 15 秒是很成问题的。
  • heroku dyno 是standard, heroku postgres 数据库是hobby-basic
  • 我愿意使用任何最好的方法来减少时间。例如,如果可以进行代码优化,那就太好了。但是,如果将 postgres 数据库从 hobby-basic 增加到 standard-0 会有所帮助,我也会考虑这一点。
  • 日志样本(这是 6 行几乎相同,但总共有 504 行这样的!):

更长的解释

这是视图中的表单

这是控制器动作

一个快速的文字解释:基本上 504 循环只是循环通过 504 个 1 小时的时间段,如果该时间已经预订,则显示“时间段已预订”,或者如果时间段未预订,则显示复选框(因此医生可以决定是否让自己在那个时间段可用)。

最后,完整的日志在这里

0 投票
2 回答
106 浏览

node.js - 使用 RavenDB 的“传统”一对多查询

我知道includeRavenDB 的 -feature。它允许我在一次往返数据库的过程中立即获取引用的文档。但我的问题是:我首先获取的文档不包括对“其他”文档的引用。但是“其他”文件引用了当前文件。

想象一下我们在世界各地都有站点的设置。每个都site可能触发各种警报。每个alarm都有对sitevia的引用siteId

现在我想获取所有站点的列表,包括所有警报。但看起来,这对 RavenDB 来说是不可能的吗?因为include只接受site-Document 中的“路径”,该路径包含引用文档的 id(或 id 数组)。

这可以通过在包含订单lineItems站点alarmIds内提供一个数组来解决,该站点将运行多年,收集 0 到 100 万之间的警报。这对我来说似乎是个坏主意。site'-document and referencing this array in . But in contrast to a lot of examples featuring stuff like an withwhere the order is a self contained thing, my

当然我也可以反过来:include通过 查询所有警报和站点sitesId。但这不会返回警报为零的站点。

那么这只是我这边的一个设计错误吗?我误解了什么?还是不可能在一个查询中执行此操作并防止“n+1 查询”?