代码之家  ›  专栏  ›  技术社区  ›  sbrattla

同一事务中的多个非有序读取查询是否会返回相同的结果?

  •  0
  • sbrattla  · 技术社区  · 5 年前

    我正在开发一个功能,可以检索特定实体的一个或多个实例。所涉实体 多个一对多关系 与其他实体合作。我需要用这些关系填充基本实体。

    我首先加载基本实体,然后运行多个后续查询,每个查询加载一组一对多关系。

    select [...] from hierarchynode_track this_ inner join hierarchynode hnd1_ on this_.hierarchynode_id=hnd1_.id inner join track trk2_ on this_.track_id=trk2_.id left outer join agreement_track agr3_ on trk2_.id=agr3_.track_id left outer join agreement agt4_ on agr3_.agreement_id=agt4_.id left outer join originalpublisher opu5_ on agt4_.originalpublisher_id=opu5_.id left outer join society soc6_ on opu5_.society_id=soc6_.id where hnd1_.id in (?) limit ?
    
    select [...] from hierarchynode_track this_ inner join hierarchynode hnd1_ on this_.hierarchynode_id=hnd1_.id inner join track trk2_ on this_.track_id=trk2_.id left outer join genrenode_track grs3_ on trk2_.id=grs3_.track_id left outer join genrenode gnr4_ on grs3_.genrenode_id=gnr4_.id where hnd1_.id in (?) limit ?
    
    select [...] from hierarchynode_track this_ inner join hierarchynode hnd1_ on this_.hierarchynode_id=hnd1_.id inner join track trk2_ on this_.track_id=trk2_.id left outer join hierarchynode_track thr1x3_ on trk2_.id=thr1x3_.track_id left outer join hierarchynode hnd1x4_ on thr1x3_.hierarchynode_id=hnd1x4_.id where hnd1_.id in (?) limit ?
    

    基本查询总是相同的,但每个查询最终都会与特定的表进行连接。查询条件将始终相同。

    只要我在同一事务中运行查询,这三个查询是否总是返回相同的基本实体集?没有对查询执行特定的排序,查询是在事务隔离级别下运行的 READ COMMITED .

    笔记 :另一种方法是先运行“基本查询”,然后从该结果中检索实体id。从那里,我可以使用 IN 在基本实体上进行筛选。然而,我怀疑 在里面 当基本实体id的数量在 在里面 条件增长(例如1000-2000个基本实体)。

    0 回复  |  直到 5 年前
        1
  •  1
  •   matigo    5 年前

    这个问题的简单答案是 通常 .

    不包含 ORDER BY 按照它们在用于查询的主索引中出现的顺序返回。因此,如果提供了相同的条件进行过滤,那么期望查询引擎使用相同的索引并以相同的顺序返回结果是合理的。这意味着如果索引是聚集的或包含 ASC / DESC ,如果索引没有任何隐含序列,则会产生FIFO。