2016-09-05 4 views
0

У меня есть таблица 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 данных):

enter image description here

Второй запрос (медленный):

enter image description here


Медленный полностью нарушает представление и формирует новый SQL! Это супер странно, как Oracle может так оптимизировать это?

+2

1. Используйте современные методы поиска максимума. http://stackoverflow.com/questions/10786087/how-to-get-the-latest-employee-record-in-oracle/10786828#10786828 2. См. «Объяснить простоту» для запроса. 3. Да, просмотр плохо оптимизирован. – Mike

+0

Возможно, у вас есть указатель на 'currency', но не на' id' в вашей таблице 'order'? Как быстро «выбирается» из заказа, где id = «xxxx» запускается? – mathguy

+0

@mathguy Yup, 'id' это индекс. результат выйдет через секунду. – GMsoF

ответ

0

Я использую Майк, я переписать сценарий, и он работает быстро сейчас, хотя основная причина не определена, вероятно, из-за алгоритм оракула оптимизатора работает по-разному что я ожидаю.

0

Кажется, проблема связана с планом второго запроса. потому что он использует петли гнезда на месте хеш-сустава. сначала проверьте, истинно ли значение _hash_join_enable, если оно неверно, измените его на true. если это правда, есть некоторые проблемы с оптимизатором oracle. для проверки его использования подсказки USE_HASH (tab2 tab1).

С уважением Мохсен

+0

В обоих планах есть как минимум одно хеш-соединение, поэтому они должны быть включены. –