У меня есть запрос, который выполняется очень быстро (быстро) при запуске, но как только я пытаюсь выполнить поиск по объединенному значению, производительность падает.
Какие есть варианты для поддержания высокой производительности? Я знаю, что очевидным решением является не поиск по объединенной строке, но будут ситуации, в которых я не могу не делать этого. Как мне справиться с этими ситуациями.
Пример 1: работает быстро
Select * From
(
With Exmp1 AS
(
Select ID, RCD From Table1 a where EFFDT = (Select Max(b.EFFDT)
FROM Table1 b
Where a.ID = b.ID and a.RCD = b.RCD) and status = 'A'
)
Select USERNAME, RCD
From MainTable MT Inner Join Exmp1 E1 ON MT.ID = E1.ID
)
Where USERNAME = 'test1'
Пример 2: работает медленно
Select * From
(
With Exmp1 AS
(
Select ID, RCD From Table1 a where EFFDT = (Select Max(b.EFFDT)
FROM Table1 b
Where a.ID = b.ID and a.RCD = b.RCD) and status = 'A'
)
Select USERNAME || '@domain.com', RCD
From MainTable MT Inner Join Exmp1 E1 ON MT.ID = E1.ID
)
Where USERNAME = 'test1@domain.com'
Если вам интересно, почему у меня весь запрос заключен в выборку, приложение, которое использует этот запрос, ожидает, что запрос начинается с «Выбрать». Я уже пытался переписать его без предложения «with», но получил те же результаты.
Select USERNAME || '@domain.com', RCD
From MainTable MT Inner Join
(Select ID, RCD
From Table1 a
Where EFFDT = (Select Max(b.EFFDT) FROM Table1 b Where a.ID = b.ID and a.RCD = b.RCD) and status = 'A'
) E1 ON MT.ID = E1.ID
Where USERNAME|| '@domain.com' = 'test1@domain.com'
============
Отредактировано для дополнительной информации:
Таблица1 имеет четыре столбца: ID, RCD, EFFDT, STATUS. Важно, чтобы я получал только самые последние записи (EFFDT) и записи со значением состояния «A».
Основная таблица имеет два столбца: ID, ИМЯ ПОЛЬЗОВАТЕЛЯ. Я не могу изменить эту таблицу или создать дополнительные таблицы, представления базы данных. Я должен использовать эти данные в том виде, в каком они существуют сегодня, и взаимодействовать только в форме запросов SQL.
Желаемый результат - USERNAME@domain.com и RCD для данного USERNAME@domain.com.
.
Помните, что это только конкретный пример, и общая помощь по этому вопросу приветствуется.