Итак, я запрашиваю очень большие таблицы. Причина, по которой они так велики, заключается в том, что 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_ids, но когда я присоединяюсь к своим таблицам, имеющим только несколько записей в них с несколькими из этих таблиц 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) сначала объединяется с каждой из удаленных?
РЕДАКТИРОВАТЬ: Приложению требуются данные в реальном времени, поэтому, к сожалению, материализованного представления или другого метода кэширования данных будет недостаточно.