0

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

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')

这些查询的不同之处在于如何requstingProcess与 连接packStatus。一般来说,这两种方法中哪一种在性能方面更可取?我在 Postgres 8.4 上使用 Hibernate 3.3 提供的 JPA 1.2。

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

4

1 回答 1

2

使用EXPLAIN ANALYZE并查看。

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

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

于 2012-11-15T22:58:41.700 回答