Оптимизация оракула - PullRequest
       27

Оптимизация оракула

2 голосов
/ 05 сентября 2011

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

Я думаю, это потому, что я ссылаюсь на две связанные базы данных

Вот мой запрос

select column2, column3, column4 
  from table1@dev 
 where column1 in (
          select distinct column2 
            from table2@dev 
           where column3 > 0
                  ) 
order by column1

Есть ли способ оптимизировать этот запрос?

Я пытался использовать join, но кажется, что запрос выполняется дольше

Заранее спасибо

РЕДАКТИРОВАТЬ

Из дальнейших исследований DRIVING_SITE делает его работать очень быстро, как это

select /*+ DRIVING_SITE(table1) */ t1.column2, t1.column3, t1.column4
from table1@dev t1, table2@dev t2
WHERE t2.column3 > 0

Но каккак только я добавляю distinct column2, он работает очень медленно

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

Во-первых, не нужно distinct. Запрос может быть записан как:

select * 
  from table1@dev 
 where column1 in (
          select column2 
            from table2@dev 
           where column3 > 0
                  ) 
order by column1

Во-вторых, есть (как минимум) еще два способа написать это. Либо с JOIN:

select t1.* 
  from table1@dev t1
  join table2@dev t2
 where t2.column2 = t1.column1
   and t2.column3 > 0 
group by
       t1.id, t1.column1, ... 

order by t1.column1

или (мое предпочтение) с EXISTS:

select t1.* 
  from table1@dev t1 
 where exists
       ( select *
           from table2@dev 
          where t2.column2 = t1.column1
            and t2.column3 > 0
                  ) 
order by column1

В любом случае вам следует проверить планы выполнения для всех из них.

Я ожидаю, что производительность будет наилучшей, если у вас есть индекс для table1.column1 и для table2, либо индекс для column2, либо составной индекс для (column3, column2)

0 голосов
/ 05 сентября 2011

Я что-то упускаю, полагая, что это сработает?

select t1.* 
from table1 t1, table2 t2 
where t1.column1 = t2.column2(+) 
and t2.column3 > 0;
0 голосов
/ 05 сентября 2011

Я согласен с Шеннон выше, но вы можете создать представление на сервере dev?

Также select * немного непослушно - лучше назвать поля, которые выдействительно хочу.Для очень больших наборов данных, которые также улучшат производительность.

...