问题标签 [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 - 最新值的 SQLAlchemy 高效子查询
实体属性的当前值可以作为该实体的EntityHistorystatus
表中的最新条目进行查询,即
如何编写一个高效的 SQLALchemy 表达式,该表达式急切地从历史表中为所有实体加载当前值,而不会导致 N+1 个查询?
我尝试为我的模型编写一个属性,但是当我迭代它时,这会为每个 (N+1) 生成一个查询。据我所知,没有子查询就无法解决这个问题,这对我来说在数据库上仍然效率低下。
示例EntityHistory
数据:
所以实体 1 的当前值为 ,实体 2 的当前z
值为y
。后备数据库是 Postgres。
c# - Session.Get 即使在lazy=false 时也会加载 N+1
我有这样的实体:
它们都不是延迟加载的。
当我这样做时,session.Get<User>()
我会看到这样的查询:
我试图将它们全部预加载到会话缓存中:
有查询
但是 NHibernate 忽略了它们都已经加载到会话缓存中并生成相同的 N+1 查询的事实!如何解决这个问题?
更新:预加载
session.Get<User>
删除 N+1 但在我想要避免的情况下第二次使 NHibernate 加载字符!
c# - EF Core 嵌套 Linq 选择导致 N + 1 个 SQL 查询
我有一个数据模型,其中“Top”对象具有 0 到 N 个“Sub”对象。在 SQL 中,这是通过外键实现的dbo.Sub.TopId
。
在 Entity Framework 6(延迟加载关闭)中,此 Linq 查询将被转换为单个SQL 查询。结果将被完全加载,因此res[0].prop2
已经IEnumerable<SomeAnonymousType>
被填充。
使用 EntityFrameworkCore (NuGet v1.1.0) 时,子集合尚未加载并且类型为:
在您对其进行迭代之前,不会加载数据,从而导致 N + 1 次查询。当我添加.ToArray()
到查询中(如注释中所示)时,数据被完全加载到var res
,但是使用 SQL 分析器显示这不再在 1 个 SQL 查询中实现。对于每个“Top”对象,都会执行对“Sub”表的查询。
首先指定.Include(t => t.Sub)
似乎没有改变任何东西。使用匿名类型似乎也不是问题,用替换new { ... }
块new MyPocoClass { ... }
不会改变任何东西。
我的问题是:有没有办法获得类似于 EF6 的行为,所有数据都立即加载?
注意:我意识到在此示例中,可以通过在执行查询后在内存中创建匿名对象来解决问题,如下所示:
然而这只是一个例子,我确实需要创建对象作为 Linq 查询的一部分,因为 AutoMapper 使用它来填充我项目中的 DTO
更新:使用新的 EF Core 2.0 进行测试,问题仍然存在。(21-08-2017)
aspnet/EntityFrameworkCore
在GitHub 存储库上跟踪问题:问题 4007
更新:一年后,此问题已在版本中修复2.1.0-preview1-final
。(2018-03-01)
更新: EF 版本 2.1 已发布,其中包含一个修复程序。请参阅下面的答案。(2018-05-31)
ruby-on-rails - 如何修复 N+1 导轨
我的控制器中有一个特定的 contentType 模型。我需要通过预加载来捕获此页面中的所有内容套件。这是它的 fetch 方法:
ContentSuite 是这里的父类。它有很多已发布的工具。在模型中它看起来像:
内容套件 -> 工具包 -> 工具。(我通过 content_suite 的工具包创建了一个自定义关联来访问工具) 工具和工具包也有多对多关联。
这包括效果很好,此页面中只有 2 个查询。浏览/在服务器日志中时没有任何项目符号错误。但是当我尝试运行它的规格时:
是子弹虫还是我的错?感谢大家。
android - 如何有效地进行嵌套 SQLlite 查询
我有一个(足球)游戏数据库,其中包含时段(例如上半场和下半场)、事件(例如目标、警告)和位置(您在比赛之前和比赛期间所在的位置)的子表。
为了显示父游戏表,我使用了带有适当参数的 CursorLoader,如下所示:
这一切都很好。但是,一旦我开始遍历 Games 游标(调用 onLoadFinished 时),我需要使用当前 GameID 为 Periods、Events 和 Locations 创建子查询。所以我这样做:
虽然游戏和时段的数量不会很大(可能是 100 次),但每场比赛可能有 50 个事件,每场比赛有 2000 个地点。
我怎样才能更有效地做到这一点?我想到的可能性是:
- 一个大型的多连接查询,然后我必须对其进行排序。我对这种类型的 SQL 很满意,假设 SQLite 能有效地处理它。我不喜欢这个主要是因为时间段、事件、位置和子表,所以我实际上会去规范化并造成巨大的混乱。
- 将期间、事件等的 selectionArgs 扩展为我拥有的 10 或 100 个游戏的动态列表
- 不知何故提高了我所拥有的东西的效率并将这些变成了异步查询
任何建议或指示表示赞赏。
ruby-on-rails - Rails:使用相同的表 one_to_many 和范围条件优化查询 N+1
这是我面临的一个挑战,使用 Rails 5(我使用报告 N+1 查询的Skylight服务,他们推荐的解决方案在这里,但在我的情况下还不够)。
我有一个表nodes
,一个Node
可以有几个nodes
与之相关的(有一个名为 的列parent_node_id
),这使我能够将一个与多个相关联。
重要
层次结构的级别最大为 1。这意味着node.nodes.first.node
不会发生 a。node
有 a 的Aparent_node
没有了nodes
。
问题是我正面临 N+1 的性能问题,nodes
因为在原始查询中包含 是不够的,因为在循环中我用不同的范围查询每条记录。这是一个暴露问题的示例代码:
无论如何,这将触发每个变量的 SQL 查询,nd3
因为another_scope
它会修改原始nds
值,并且我不能在nds
值中包含条件,因为nodes
不符合条件another_scope
的nd2
.
有没有办法优化这个?
performance - JPA @OneToOne 选择具有 N+1 个查询的列表
我实际上是在尝试使用 JPA@OneToOne
注释将Child
实体链接到它的Parent
.
它运行良好,除了在获取Child
s 列表时,JPA 引擎(在本例中为 Hibernate)进行 1+n 次查询。
这是 Hibernate 查询的日志:
使用完全相同的实体定义,特别是当我得到一个孩子时,JPA 使用预期的 JOIN 执行查询:
这是Child
实体定义:
和Parent
实体:
您可以在此处找到运行代码的完整示例: https ://github.com/Alexandre-Carbenay/demo-jpa-onetoone
Child
获取实体列表时有没有办法避免 1+n 查询Parent
?
ruby-on-rails - 避免在具有不同关系的 Rails STI 上进行 n+1 查询
所以假设我有以下模型:
并且假设我遵循 jsonapi 规范并使用包含的顶级成员在单个 http 调用中呈现每个相关对象。
所以建筑物/表演看起来像这样:
我无法从包含的成员中急切地加载关系,因为它并不存在于数组的所有成员中。
例如,在控制器中:
如果房间关系中有办公室,则不会工作,因为它没有计算机关系。
也不起作用,因为培训室关系提供了对要侧载的计算机的访问,但不能在渲染代码中直接访问,因此是无用的缓存。
此外,我尝试将默认范围应用于培训室以急切加载计算机关联,但这也没有达到预期的效果。
在这一点上我唯一能想到的是将计算机关系应用于 Room 类,但我并不想这样做,因为只有培训室应该有计算机。
我很想听听任何想法。
ruby-on-rails - 如何避免依附N+1
给定
如何在尝试显示每个头像时active_storage_attachments
避免N+1 次查询?active_storage_blobs
ruby-on-rails - Rails 中自定义方法的 N+1 问题
在我的 rails 应用程序中,我有一个User
模型,其方法名为price_tier
:
但是,当我有一个集合@users
并一个一个调用 price_tier 时,它将PriceTier
为每个实例加载查询,这会导致 N+1 问题。
includes
不在这里工作,因为它不是一个协会。
有没有办法修改修复 N+1 问题的代码?