加入实体的方法更快?

时间:2012-11-15 20:02:50

标签: java hibernate postgresql jpa jpql

以下是检索等效数据的两个查询:

SELECT DISTINCT packStatus
  FROM PackStatus packStatus JOIN FETCH packStatus.vars, ProcessEntity requestingProcess
    WHERE
      packStatus.status.code='OGVrquestExec'
      AND packStatus.procId=requestingProcess.activityRequestersProcessId
      AND requestingProcess.id='1000323733_GU_OGVProc'

SELECT DISTINCT packStatus
  FROM PackStatus packStatus JOIN FETCH packStatus.vars
    WHERE
      packStatus.status.code='OGVrquestExec'
      AND packStatus.procId=(SELECT requestingProcess.activityRequestersProcessId FROM ProcessEntity requestingProcess WHERE requestingProcess.id='1000323733_GU_OGVProc')

这些查询在requstingProcesspackStatus的加入方式上有所不同。一般而言,这两种方法中的哪一种在性能方面更优选?我在Postgres 8.4上使用Hibernate 3.3提供的JPA 1.2。

UPD:我用我的应用程序中的真实查询替换了假查询。这是Hibernate为firstsecond查询生成的SQL。查询计划的链接:firstsecond。查询计划看起来非常相似。唯一的区别是来自bpms_process表的数据聚合到查询结果的那一刻。但我不知道这些结果的概括是否正确?对于仅在连接方法上有所不同的查询,查询计划是否几乎相同?是否可以通过更改连接方法来获得查询成本的巨大差异?

1 个答案:

答案 0 :(得分:2)

使用EXPLAIN ANALYZE并查看。

如果他们变成相同的查询计划,我不会感到惊讶。

请参阅:https://stackoverflow.com/tags/postgresql-performance/info