当前位置: 首页 > 面试题库 >

优化Spring-Data JPA查询

柯奕
2023-03-14
问题内容

我正在寻找框架生成的查询的可能的优化。据我了解,该过程如下:

  • 你可以声明你的域对象是POJO和增加几个注解@Entity@Table@ManyToOne等等。

  • 声明您的存储库,例如每个接口

使用(2),您可以通过多种方式描述您的查询:例如,每个方法名或 @Query

如果我写这样的查询:

@Query("select t from Order t LEFT join fetch t.orderPositions where t.id = ?1")
Page<Order> findById(Pageable pageable, String id);

将自动生成一个SQL查询,其中解析订单的每一列,并随后解析订单位置和相关对象/表。好像我写了:

select * from order

因此,以防万一,我需要来自 多个 连接对象的 一些
信息,查询可能会非常昂贵:并且更有趣的是效率很低。我偶然发现了一个缓慢的查询,MySQL解释说,在 生成的 查询中,优化器无法利用索引,这很不好。


当然(我知道)我必须权衡一个问题,即 生成的 SQL不如 手动 编写的那样理想,并且具有编写更少样板代码的优势。

我的问题是:改善查询,查询执行的好的策略是什么?

我自己考虑过一些选择:

1)是否可以为不同的目的定义多个“实体”,例如Order访问订单的 全部
特征,以​​及FilteredOrder使用更少的列和没有解析度的东西Join- columns?两者都将引用相同的表,但是一个将使用所有列,而另一个仅使用一些。

2)@Query(... native="true")选择要使用的所有列。这样做的好处是,我不会将域对象加倍,也不会用数百个Filtered-Object填充我的代码库。那分页呢?使用pageable结合@Query( ...native="true")仍然有可能(恐怕没有)。

3)最后但在我眼中,“最糟糕” /样板的解决方案:JDBCTemplates在较低的水平上使用和做一些事情。

还有其他我没有想到的选择吗?感谢您在该主题上的任何启发:]

更新: 我们目前的策略是

1)在可能的情况下,我将与 select new 一起工作
如我所见,它适用于每个Object(无论是
Entity 还是 POJO

2)与数据库 视图 结合使用时,可以充分利用 SQLORM的优势
。对于某些用例,手头有一个聚合结果集可能会很有趣。通过将此结果集定义为视图,可以从数据库角度轻松地通过简单的 select -statement
观察结果。对于ORM端,这意味着您可以轻松定义与该视图匹配的实体,并在顶部获得整个 ORM优点 :分页包括。


问题答案:

一种解决方案是使用DTO:

@Query("select new FilteredOrder(o.name, o.size, o.cost) from Order o where o.id = ?1")
Page<FilteredOrder> findFilteredOrderById(Pageable pageable, String id);

如果您想为某些报告生成实体,也许您应该考虑使用nosql数据存储



 类似资料:
  • 我正在为框架生成的查询寻找可能的优化。据我所知,过程如下: > 您可以将域对象声明为POJO并添加几个注释,例如、、等。 您声明您的存储库,例如每个接口 使用(2),您有几个选项来描述您的查询:例如,每个方法名或 如果我写一个类似如下的查询: SQL查询是自动生成的,其中订单的每一列都会被解析,然后依次针对订单位置和依赖对象/表。就像我写道: 因此,如果我需要来自多个联接对象的一些信息,查询可能非

  • 我在使用与Spring Data JPA集成的QueryDSL时遇到了一个奇怪的行为: 我在Project和Person之间有ManyToOne关系。如果我通过所有者ID(外键)获取属于用户的所有项目,一切都按预期工作: 生成的查询: 但是,假设我们想通过一个不是外键的字段(例如所有者的姓名)获取属于一个人的所有项目: 在这些情况下,表Person被不必要地连接了两次(请注意person1_和pe

  • 问题内容: 我希望从我的用户模型中检索一些信息,如下所示: 在主页中,我有一个 位置 过滤器,您可以在其中浏览来自国家或城市的用户。 所有字段还包含其中的用户数: 在主页上,然后我还有“学生和老师”页面,我希望仅提供有关这些国家和城市有多少老师的信息… 我想做的是创建一个对MongoDB的查询,以通过单个查询检索所有这些信息。 此刻查询如下: 问题是我不知道如何获取所需的所有信息。 我不知道如何获

  • 问题内容: 此查询需要153秒才能运行。中有数百万行。 我认为查询要花很长时间,因为where子句中的功能。但是,我需要在列上执行ltrim rtrim,而且日期也必须在格式上匹配。如何优化此查询? 说明计划: 首要的关键: 索引: 但是,在解释计划中,我看不到使用索引/主键。那是问题吗? 问题答案: 试试这个: 如果尚无时间,请从其外观(出生日期?)上删除该对象。除此之外,您还需要一些索引工作。

  • 主要内容:概述,一、关联查询优化,1.左(右)外连接,2.内连接,3.JOIN语句原理,4.JOIN小结,5.Hash Join,二、子查询优化,三、排序优化,四、GROUP BY优化,五、优先考虑覆盖索引,六、使用前缀索引,七、索引下推ICP,八、其他查询优化,1.COUNT(*)与COUNT(具体字段)效率,2.不使用SELECT *,3.LIMIT 1优化,4.多使用commit概述 数据库调优的方式有多种: 建立索引、充分利用到索引、不让索引失效 对SQL语句进行优化 调优如缓冲、线程数

  • 本文向大家介绍Mysql慢查询优化方法及优化原则,包括了Mysql慢查询优化方法及优化原则的使用技巧和注意事项,需要的朋友参考一下 1、日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改为'yyyy-MM-dd','yyyy-MM'改为'yyyy-MM-dd'【这样MYSQL会转换为日期类型】 2、条件语句中无论是等于、还是大于小于,WHERE