2015-09-24 2 views
-1

У меня есть запрос Oracle в следующем формате:Ускорить медленный оракул запрос

select col1, min(col2), max(col2) 
from table1 
where col2 between add_months(to_date('12/06/2014', 'mm/dd/yyyy'), -6) and to_date('12/05/2014', 'mm/dd/yyyy') 
and col3 = 'CLICKS' 
and col4 = '-8' 
and col1 in (select col1 from table2 where id = '05742') 
group by col1 

В моей схеме, table1 очень велико (миллионы, возможно, миллиарды записей), но таблица 2 достаточно мала. Любые идеи о том, как его оптимизировать?

+3

Каков текущий план запроса? Какие индексы доступны? Насколько избирательны различные условия? Сколько строк в 'table1' нужно будет читать для создания агрегатов? Сколько времени занимает запрос? Как быстро вам это нужно? Представлены ли материализованные взгляды? –

+1

любая причина, по которой вы используете ADD + MONTHS в литературе даты вместо изменения строки даты? Не проблема производительности, просто зацепка. Кроме того, 'col4' действительно строка? Если нет, то почему '' -8'' – APC

+0

Что говорит Джастин, плюс. Сколько строк (какой процент) попадает в указанный диапазон дат? Сколько из них имеет 'col1' соответствующие строки в' table2'? Предположительно, вы не используете разделение (несмотря на потенциальные миллиарды строк)? – APC

ответ

0

Попробуйте это:

select t2.col1, min(col2), max(col2) 
from table2 t2 
join table1 t1 on t1.col1 = t2.col1 
    on t1.col2 between add_months(to_date('12/06/2014', 'mm/dd/yyyy'), -6) and to_date('12/05/2014', 'mm/dd/yyyy') 
    and t1.col3 = 'CLICKS' 
    and t1.col4 = '-8' 
where t1.id = '05742' 
group by t2.col1 

Это будет особенно эффективным, когда table2 мала и table1 велика.

Примечание: Если тип данных table.id является числовой (а не текст), вы должны кода, где положение условие, как:

where t1.id = 5742 

поэтому тип значения совпадает с типом столбца, в случае, дБ является глупым и отличает столбец, чтобы он соответствовал значению, а не наоборот, и поэтому не использует этот индекс, который я видел, случается много раз.

Смежные вопросы