Как улучшить производительность SQL в Oracle, который загружает только элементы, измененные за последние 5 дней? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть таблица M, в которой есть столбцы CREATED_AT и MODIFIED_AT (Дата), и эта таблица очень большая.Мне нужно изменить или создать строки за последние 5 дней:

Select * from M where MODIFIED_AT >= trunc(sysdate)-5 OR CREATED_AT >= trunc(sysdate)-5

Для них нет индекса, и я боюсь, что Oracle выполнит полное сканирование и будет работать медленно.Какой тип индекса может быть создан, чтобы улучшить это?

MODIFIED_AT - Nullable, CREATED_AT - Not-Null.Лучше ли создать один индекс, включающий оба столбца, или 2 индекса для каждого столбца в отдельности?

ОБНОВЛЕНИЕ Есть еще одна вещь: некоторые из вас предложили создать объединение индексов на основе функций (ified_at, selected_at), вещьв том, что элементы в этой таблице изменяются очень редко, но обычно создаются большими кусками (создаются системой, изменяются при необходимости пользователями).Таким образом, может быть много элементов с тем же созданным и нулевым измененным значением.Но все равно будут некоторые элементы, для которых не указано значение variable_at.Имеет ли смысл создавать растровый индекс?Или любой другой способ использовать тот факт, что create_at будет одинаковым для больших кусков элементов в таблице M?

А также, имеет ли какое-то значение создание индекса ASC или DESC?

1 Ответ

0 голосов
/ 18 сентября 2018

Я бы порекомендовал использовать union all:

select m.*
from m
where CREATED_AT >= trunc(sysdate) - 5
union all
select m.*
from m
where MODIFIED_AT >= trunc(sysdate) - 5 and CREATED_AT <  trunc(sysdate) - 5;

. В этом случае можно использовать индексы m(created_at) и m(modified_at, created_at).

. Простым способом может быть обеспечение того, чтоmodified_at устанавливается при создании записи.Тогда вы можете просто сделать:

select m.*
from m
where MODIFIED_AT >= trunc(sysdate) - 5 ;

Или другой вариант:

select m.*
from m
where greatest(MODIFIED_AT, created_at) >= trunc(sysdate) - 5 ;

с индексом на основе функций в m( greatest(MODIFIED_AT, created_at) ).Это предполагает, что ни один столбец не является NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...