以下是检索等效数据的两个查询:
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 生成的 SQL和 second询问。查询计划链接:first , second 。查询计划看起来非常相似。唯一的区别是 bpms_process 表中的数据聚合到查询结果的时刻。但我不知道对这些结果进行概括是否正确?对于仅连接方法不同的查询,查询计划是否几乎相同?通过改变连接方法是否可以使查询成本有很大的差异?
最佳答案
使用EXPLAIN ANALYZE
并查看。
如果它们变成相同的查询计划,我不会感到惊讶。
参见:https://stackoverflow.com/tags/postgresql-performance/info
关于java - 什么方法加入实体更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405230/