所以我正在查询一些非常大的表。它们如此大的原因是因为 PeopleSoft 每次对某些数据进行更改时都会插入新记录,而不是更新现有记录。实际上,它的事务表也是一个数据仓库。
这需要其中包含嵌套选择的查询,以获取最新/当前行。它们都具有生效日期,并且在每个日期(转换为一天)内,它们都可以具有有效的序列。因此,为了获得 的当前记录user_id=123
,我必须这样做:
select * from sometable st
where st.user_id = 123
and st.effective_date = (select max(sti.effective_date)
from sometable sti where sti.user_id = st.user_id)
and st.effective_sequence = (select max(sti.effective_sequence)
from sometable sti where sti.user_id = st.user_id
and sti.effective_date = st.effective_date)
这些表上有大量的索引,我找不到任何可以加快查询速度的东西。
我的麻烦是,我经常想从这些表中获取大约 50 个 user_id 的个人数据,但是当我将其中只有几条记录的表与其中一些 PeopleSoft 表连接起来时,事情就变得一团糟。
PeopleSoft 表位于我通过数据库链接访问的远程数据库上。我的查询往往是这样的:
select st.* from local_table lt, sometable@remotedb st
where lt.user_id in ('123', '456', '789')
and lt.user_id = st.user_id
and st.effective_date = (select max(sti.effective_date)
from sometable@remotedb sti where sti.user_id = st.user_id)
and st.effective_sequence = (select max(sti.effective_sequence)
from sometable@remotedb sti where sti.user_id = st.user_id
and sti.effective_date = st.effective_date)
当我必须将几个 PeopleSoft 表与我的本地表连接时,情况会变得更糟。性能简直不能接受。
我可以做些什么来提高性能?我已经尝试过查询提示,以确保我的本地表首先连接到其在 PeopleSoft 中的合作伙伴,因此在将其缩小到正确的 user_id 之前,它不会尝试将其所有表连接在一起。我已经尝试了这个LEADING
提示,并玩弄了试图将处理推送到远程数据库的提示,但是解释计划很模糊,只是对几个操作说“远程”,我不知道发生了什么。
假设我无权更改 PeopleSoft 和我的桌子的位置,提示是我的最佳选择吗?如果我要加入一个包含四个远程表的本地表,并且本地表与其中两个表连接,我将如何格式化提示,以便我的本地表(非常小 - 事实上,我可以做一个内联视图让我的本地表只是我感兴趣的 user_ids)首先与每个远程表连接?
编辑:应用程序需要实时数据,所以不幸的是物化视图或其他缓存数据的方法是不够的。