Рассмотрим этот вид таблицы:
create table t (
id number, -- and many many other columns of course
record_date date -- the date when the rows is inserted
);
В этой таблице мы добавляем 400 тыс. Строк в час. И каждый час мы запускаем запрос с использованием последнего часа данных. A SQL
как:
SELECT
...
FROM t
INNER JOIN ... -- t is joined with many other tables
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
WHERE
t.record_date >= :my_current_date - 1/24
;
Проблема, с которой мы столкнулись, заключается в том, что План часто плохой в такой ситуации. Вот причина, по которой:
Когда Oracle
вычисляет статистику таблицы, она сохраняет max(record_date)
в статистике под названием high_value . Таким образом, когда запускается SQL
, Oracle
сравнивает фильтр t.record_date >= :my_current_date - 1/24
с высоким значением_в столбце record_date
и считает, что вряд ли строка будет возвращена (вместо 400k). Поэтому оптимизация следующих объединений не может быть хорошей ...
Какое наилучшее решение в такой ситуации? Я мог бы использовать подсказку, например ...