以下是检索等效数据的两个查询:
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为first和second查询生成的SQL。查询计划的链接:first,second。查询计划看起来非常相似。唯一的区别是来自bpms_process表的数据聚合到查询结果的那一刻。但我不知道这些结果的概括是否正确?对于仅在连接方法上有所不同的查询,查询计划是否几乎相同?是否可以通过更改连接方法来获得查询成本的巨大差异?
答案 0 :(得分:2)
使用EXPLAIN ANALYZE
并查看。
如果他们变成相同的查询计划,我不会感到惊讶。
请参阅:https://stackoverflow.com/tags/postgresql-performance/info