我有一个查询需要很长时间,我想优化它。我正在寻找最有效的方式来做到这一点。优化查询 - 使用字段或使用其他表格
我正在使用PostgreSQL数据库的Hibernate/JPA,但任何解决方案应该是一个通用的JPA之一。
术语
- 用户:在系统中的用户。
- 朋友:用户的一个朋友。用户将有N个朋友。
- 会议:使用系统的会话。可以打开或关闭。
- 上下文:会话的上下文。用户可能在任何给定时间内每个上下文有一个打开的会话,并且每个上下文可能有许多过去的关闭会话。
查询
我需要执行一个查询,给定一个用户名,使我有以下几点:
- 获取该用户的所有朋友
- 对于每个朋友:
- 如果朋友有任何打开的会话,请获取所有打开的会话(针对所有上下文)
- 否则,请将朋友的最新会话排除在所有上下文之外。
注意,友谊都是存储在不同的数据库,所以我不能将此主题融入在任何情况下,一个大的查询。
例
用户A具有三个朋友:B,C,d。有两个上下文,1和2。朋友具有以下数据:
(下面的格式是会话ID - 用户,语境)
- 1 - B,1:打开会话
- 2 - B,2:开始关闭会话年02月 - 27
- 3 - B,2:上开始闭会话FEB-26
- 4 - C,1:02月27
- 5开始关闭会话 - C,1:关闭会话2月26日开始
- 6 - C,2:02月 - 26
- 7开始关闭会话 - C,2:关闭会话年02月 - 25
- 8开始 - d,1:打开会话
- 9 - d, 2:打开会话
查询应得到我: B:第一节(所有打开的会话) C:第4节(最新的非公开会议) d:8,9会话(所有打开的会话)
当前状态
我查询的工作分三个步骤:
- 获取用户
- 的各界朋友对每个朋友:
- 获取所有打开的会话的朋友
- 如果有任何公开会议,返回所有公开会话
- 获取最新的会话为朋友,返回该会话
显然这是很多的疑问。 对于初学者,我将采取上述步骤2并将其转换为单个查询。我的担心与第二个查询有关。问题是 - 如何使其更加优化。因此,该问题可以改述:
“给定一组N个朋友ID,获取所有这些朋友的所有开放会话或最新会话。”
建议的解决方案
有我们想出了两种基本的解决方案,我们正在考虑这将是更好的。
表解决方案表示将保留一个将在用户,上下文和最新会话之间关联的新表。该解决方案的含义是:
- 创建一个新的实体&表“最新会议”
- 表将具有这些列:
- 用户
- 语境
- 最新会话ID
- 该表将由会话实体在post persist上进行更新,以便任何新的p ersisted会话将自动更新此表。
- 新查询将从此表中获取用户所有朋友的所有记录,并对其进行处理以创建最终结果。
列解决方案表示在会话表上保留“最新”标志列。该解决方案的含义是:
- 创建最新的(一个布尔值)一个新的领域
- 列将通过邮寄方式设置持久会话实体,使昔日的“最新”会议将不再是最新的,新的会议将成为最新的会议。
- 新查询将从原始会话表中获取用户所有朋友的所有最新记录(通过将新列纳入语句的条件中)并对其进行处理以创建最终结果。
这些都有优点和缺点,我们似乎还没有赢家。显然,可能还有其他更好的解决方案我们没有考虑过。我希望看到的是以上哪个更好,为什么,或者是你自己的更好的方法。
为什么不同的数据库友谊?它是真的不同的数据库或不同的架构? – Unreason 2011-02-28 10:42:43
如何使用功能视图? 缓存可能是一个很大的帮助,如果可能的话。 – 2011-02-28 10:16:18
据我了解,一个视图会以这种或那种方式运行复杂的查询,并且我试图通过在数据库更新期间引发更多管理来避免这种情况,从而提高查询的性能。 – 2011-02-28 10:28:28