在生产环境中,NamedQuery的处理时间慢20倍

时间:2018-06-25 10:48:01

标签: java tsql jpa named-query

我有两个数据库-一个来自生产环境,一个来自开发环境。我的MyClass中还有一个名为@Entity的命名查询:

@NamedQuery(name = "MyClass.findByFirstConditionAndSecondCondition" , query = "SELECT mc FROM MyClass mc WHERE mc.firstCond = :firstCond AND mc.secondCond = :secondCond")

在MyClass中,我有:

  • @ManyToOne与MyClass2的关系
  • @OneToMany与MyClass3的关系

在那些类(MyClass2,MyClass3)中,我也与另一个类有关系。

我以这种形式启动了这个命名查询:

SELECT * FROM MyClass mc WHERE mc.firstCond = :firstCond AND mc.secondCond = :secondCond 

直接在数据库上,它选择生产中的62条记录和开发环境中的69条记录(相同的62条+ 7条记录)。

现在,我登录到一个应用程序并从那里触发了此功能。我测量了时间。开发人员数据库需要1181ms的时间,而生产数据库则需要19131ms的时间才能从此查询中获取结果。我只测量了这部分代码的时间:

Query getAllMyClassObjects = this.em.createNamedQuery("MyClass.findByFirstConditionAndSecondCondition");
getAllMyClassObjects.setParameter("firstCond", firstCond);
getAllMyClassObjects.setParameter("secondCond", secondCond);
List<MyClass> resultList = (List<MyClass>)getAllMyClassObjects.getResultList();

由于在开发环境中,我选择了相同的记录(另加了七个),所以我猜想此操作并不需要像现在在生产db上那样花那么多时间来记录(所有这些关系都不是什么)在不同的环境中可能会有所不同,因此,如果我拥有此@OneToMany关系,则它将在两个环境中存储相同大小的集合。

所以看来数据库本身存在某种问题,对吗?我开始检查索引,并确保在两个数据库上都有相同的索引。我已经在prod db上重建了现有索引,并且添加了丢失的索引(以匹配dev中的索引),但是没有运气。

目前,我不知道还能检查什么。有什么想法吗?

0 个答案:

没有答案