问题标签 [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.
python - 如何在 django 中正确表示“仓库” - n+1 个问题
我正在学习 Django。我正在尝试制作一个用于管理由简单元素组成的仓库的应用程序:
涉及的模型是交易、物品、仓库和房屋。
models.py
:
item_list.html
(对于通用 ListView,带有qs=Item.objects.all()
):
现在我的问题是,我的count_remaining
方法被查询集中的每个对象调用一次,当 item_list 中有很多项目时,显然会导致数据库命中呈指数级增长。
如果我必须有一个页面在模板中显示仓库中的剩余项目,我如何才能在不过多访问数据库的情况下进行此算术运算?
ruby-on-rails - 在 Rails 中查询 has_many 关系时不获取 N+1 的智能方法?
我有一个Movie
模型和一个MovieStream
模型。关系是 Movie has_many
MediaType(和 MediaType belongs_to
Movie)。
MediaType 有两个属性“url_broken”(真/假)和“dvd”(真/假)。
在我看来,我有:
在movie_item
-部分我有(简化):
这(显然)会导致 N+1 个查询,但我看不到任何解决方法。是否有可能以某种方式以我可以同时获得streams
and的方式查询视图查询dvds
?
喜欢:
没有N+1?结尾
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
模型中做些什么来避免考虑这个问题吗?
ruby-on-rails - 在一个小节的一个急切的小节中寻找一个属性,而不引起 SQL 调用?
我有一组如下所示的模型(此处显示的实际设置是一个简化的模型):
我像这样遍历它们:
在' blog_item
'部分视图中,我想确定特定的贡献者(id:123,名称:“john”)是否包含在posts
. 作为一个一般问题,这很容易,但我想在没有 SQL 调用的情况下执行此操作(导致 N+1)。
目前,我正在解决这个问题:
这会导致 SQL 调用(以及随后的 N+1)。
我不能做这样的事情:
那么,如何在没有额外的 SQL 调用的情况下解决这个问题呢?
mysql - LEFT JOIN FETCH 不能解决 n+1 问题
我想询问 N+1 问题的解决方案。我有具有 1:M 关系的 Account 表和 Account_role 表。我通过在@Query 中使用 LEFT JOIN FETCH 尝试连接获取方法,但不起作用。
账户类:
帐户角色类:
帐户存储库类
输出
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 小时的时间段,如果该时间已经预订,则显示“时间段已预订”,或者如果时间段未预订,则显示复选框(因此医生可以决定是否让自己在那个时间段可用)。
最后,完整的日志在这里
node.js - 使用 RavenDB 的“传统”一对多查询
我知道include
RavenDB 的 -feature。它允许我在一次往返数据库的过程中立即获取引用的文档。但我的问题是:我首先获取的文档不包括对“其他”文档的引用。但是“其他”文件引用了当前文件。
想象一下我们在世界各地都有站点的设置。每个都site
可能触发各种警报。每个alarm
都有对site
via的引用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
with
where the order is a self contained thing, my
当然我也可以反过来:include
通过 查询所有警报和站点sitesId
。但这不会返回警报为零的站点。
那么这只是我这边的一个设计错误吗?我误解了什么?还是不可能在一个查询中执行此操作并防止“n+1 查询”?