以下是检索等效数据的两个查询:
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。查询计划的链接:first,second。查询计划看起来非常相似。唯一的区别是 bpms_process 表中的数据在什么时刻聚合到查询结果。但我不知道概括这些结果是否正确?对于仅在连接方法上有所不同的查询,查询计划是否几乎相同?是否可以通过更改加入方法来获得很大的查询成本差异?