问题标签 [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 回答
1324 浏览

python - 最新值的 SQLAlchemy 高效子查询

实体属性的当前值可以作为该实体的EntityHistorystatus表中的最新条目进行查询,即

如何编写一个高效的 SQLALchemy 表达式,该表达式急切地从历史表中为所有实体加载当前值,而不会导致 N+1 个查询?

我尝试为我的模型编写一个属性,但是当我迭代它时,这会为每个 (N+1) 生成一个查询。据我所知,没有子查询就无法解决这个问题,这对我来说在数据库上仍然效率低下。

示例EntityHistory数据:

所以实体 1 的当前值为 ,实体 2 的当前z值为y。后备数据库是 Postgres。

0 投票
1 回答
49 浏览

c# - Session.Get 即使在lazy=false 时也会加载 N+1

我有这样的实体:

它们都不是延迟加载的。

当我这样做时,session.Get<User>()我会看到这样的查询:

我试图将它们全部预加载到会话缓存中:

有查询

但是 NHibernate 忽略了它们都已经加载到会话缓存中并生成相同的 N+1 查询的事实!如何解决这个问题?


更新:预加载

session.Get<User>删除 N+1 但在我想要避免的情况下第二次使 NHibernate 加载字符!

0 投票
2 回答
13439 浏览

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)

0 投票
0 回答
624 浏览

ruby-on-rails - 如何修复 N+1 导轨

我的控制器中有一个特定的 contentType 模型。我需要通过预加载来捕获此页面中的所有内容套件。这是它的 fetch 方法:

ContentSuite 是这里的父类。它有很多已发布的工具。在模型中它看起来像:

内容套件 -> 工具包 -> 工具。(我通过 content_suite 的工具包创建了一个自定义关联来访问工具) 工具和工具包也有多对多关联。

这包括效果很好,此页面中只有 2 个查询。浏览/在服务器日志中时没有任何项目符号错误。但是当我尝试运行它的规格时:

是子弹虫还是我的错?感谢大家。

0 投票
1 回答
368 浏览

android - 如何有效地进行嵌套 SQLlite 查询

我有一个(足球)游戏数据库,其中包含时段(例如上半场和下半场)、事件(例如目标、警告)和位置(您在比赛之前和比赛期间所在的位置)的子表。

为了显示父游戏表,我使用了带有适当参数的 CursorLoader,如下所示:

这一切都很好。但是,一旦我开始遍历 Games 游标(调用 onLoadFinished 时),我需要使用当前 GameID 为 Periods、Events 和 Locations 创建子查询。所以我这样做:

虽然游戏和时段的数量不会很大(可能是 100 次),但每场比赛可能有 50 个事件,每场比赛有 2000 个地点。

我怎样才能更有效地做到这一点?我想到的可能性是:

  1. 一个大型的多连接查询,然后我必须对其进行排序。我对这种类型的 SQL 很满意,假设 SQLite 能有效地处理它。我不喜欢这个主要是因为时间段、事件、位置和子表,所以我实际上会去规范化并造成巨大的混乱。
  2. 将期间、事件等的 selectionArgs 扩展为我拥有的 10 或 100 个游戏的动态列表
    1. 不知何故提高了我所拥有的东西的效率并将这些变成了异步查询

任何建议或指示表示赞赏。

0 投票
1 回答
135 浏览

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_scopend2.

有没有办法优化这个?

0 投票
3 回答
4546 浏览

performance - JPA @OneToOne 选择具有 N+1 个查询的列表

我实际上是在尝试使用 JPA@OneToOne注释将Child实体链接到它的Parent.

它运行良好,除了在获取Childs 列表时,JPA 引擎(在本例中为 Hibernate)进行 1+n 次查询。

这是 Hibernate 查询的日志:

使用完全相同的实体定义,特别是当我得到一个孩子时,JPA 使用预期的 JOIN 执行查询:

这是Child实体定义:

Parent实体:

您可以在此处找到运行代码的完整示例: https ://github.com/Alexandre-Carbenay/demo-jpa-onetoone

Child获取实体列表时有没有办法避免 1+n 查询Parent

0 投票
1 回答
110 浏览

ruby-on-rails - 避免在具有不同关系的 Rails STI 上进行 n+1 查询

所以假设我有以下模型:

并且假设我遵循 jsonapi 规范并使用包含的顶级成员在单个 http 调用中呈现每个相关对象。

所以建筑物/表演看起来像这样:

我无法从包含的成员中急切地加载关系,因为它并不存在于数组的所有成员中。

例如,在控制器中:

如果房间关系中有办公室,则不会工作,因为它没有计算机关系。

也不起作用,因为培训室关系提供了对要侧载的计算机的访问,但不能在渲染代码中直接访问,因此是无用的缓存。

此外,我尝试将默认范围应用于培训室以急切加载计算机关联,但这也没有达到预期的效果。

在这一点上我唯一能想到的是将计算机关系应用于 Room 类,但我并不想这样做,因为只有培训室应该有计算机。

我很想听听任何想法。

0 投票
1 回答
261 浏览

ruby-on-rails - 如何避免依附N+1

给定

如何在尝试显示每个头像时active_storage_attachments避免N+1 次查询?active_storage_blobs

0 投票
1 回答
64 浏览

ruby-on-rails - Rails 中自定义方法的 N+1 问题

在我的 rails 应用程序中,我有一个User模型,其方法名为price_tier

但是,当我有一个集合@users并一个一个调用 price_tier 时,它将PriceTier为每个实例加载查询,这会导致 N+1 问题。

includes不在这里工作,因为它不是一个协会。

有没有办法修改修复 N+1 问题的代码?