У меня есть таблица order
, что очень просто, это хранение order
данных.Oracle посмотреть присоединиться к таблице очень странно медленный выпуск
У меня есть view
, где хранятся валютная пара и курс валют. Создается представление, как показано ниже:
create or replace view view_currency_rate as (
select c.* from currency_rate c, (
select curr_from, curr_to, max(rate_date) max_rate_date from currency_rate
where system_rate > 0
group by curr_from, curr_to) r
where c.curr_from = r.curr_from
and c.curr_to = r.curr_to
and c.rate_date = r.max_rate_date
and c.system_rate > 0
);
Ничего особенного здесь, это view
заполнить последнюю валютный курс (curr_from -> curr_to) из currency_rate
таблицы.
Когда я делаю, как показано ниже, он заполняет строку 80k (все данные), потому что у меня много записей в таблице заказа. И потраченное время составляет менее 5 секунд.
Первый запрос:
select * from
VIEW_CURRENCY_RATE c, order a
where
c.curr_from = A.CURRENCY;
Я хочу, чтобы добавить более фильтр, так что я думал, что это может быть быстрее, так что я добавил это:
Второй запрос:
select * from
VIEW_CURRENCY_RATE c, order a
where
a.id = 'xxxx'
and c.curr_from = A.CURRENCY;
И теперь это работает более 1 минуты! Я совершенно не знаю, что с этим случилось. Я думал, что это будет некоторая оптимизация оракула, не так, поэтому я пытаюсь найти другой способ, думаю, что данные 80K могут быть заполнены довольно быстро, поэтому я пытаюсь получить данные из него, поэтому я вложил SQL как показано ниже:
select * from (
select * from
VIEW_CURRENCY_RATE c, order a
where
c.curr_from = A.CURRENCY
)
where id = 'xxxx';
Это тоже проклятие! У меня заканчивается идея, может кто-нибудь объяснить, что случилось с моим скриптом?
Обновлено 6-Sep-2016
После того как я знаю, как 'объяснить план', я захватить экран:
Кулак запрос (быстрый один с 80k данных):
Второй запрос (медленный):
Медленный полностью нарушает представление и формирует новый SQL! Это супер странно, как Oracle может так оптимизировать это?
1. Используйте современные методы поиска максимума. http://stackoverflow.com/questions/10786087/how-to-get-the-latest-employee-record-in-oracle/10786828#10786828 2. См. «Объяснить простоту» для запроса. 3. Да, просмотр плохо оптимизирован. – Mike
Возможно, у вас есть указатель на 'currency', но не на' id' в вашей таблице 'order'? Как быстро «выбирается» из заказа, где id = «xxxx» запускается? – mathguy
@mathguy Yup, 'id' это индекс. результат выйдет через секунду. – GMsoF