2013-09-01 4 views
1

Я выполняю некоторые SQL-инструкции для своих данных, и у меня есть следующая ситуация.Oracle Select Query optimization

Выберите заявление выглядит следующим образом

select * 
from t1, t2 
where t1.id = t2.t1_id 
t1.c1 = 'X' and t1.c2 in ('Y', 'Z') 

Выполнение плана объяснить, я увидел, что col2 фильтрации стоил 11 (таблица Access с фильтром предикатами) и (индекс доступа к таблице) col1 1.

Как я могу снизить стоимость поиска на col2? Должен ли я вносить какие-либо намеки в мой запрос?

Спасибо заранее,

+1

Пожалуйста, вставьте план объяснения в вопрос. – krokodilko

+0

... И настоящий запрос. –

ответ

1

Я предпочитаю синтаксис ANSI для запросов:

select * 
from t1 join 
    t2 
    on t1.id = t2.t1_id 
where t1.c1 = 'X' and t1.c2 in ('Y', 'Z'); 

Рассмотрим индекс по t1(c1, c2, id) и t2(t1_id). Первый индекс должен использоваться для получения строк от t1. Второй должен ускорить соединение до t2.

EDIT:

Согласно комментарий Дэвида, индекс по t1(c1, c2) может выполнять несколько лучше.

+0

С выбором * получения всех столбцов из обеих таблиц индекс t1 также может быть (c1, c2), я думаю. –

+0

@DavidAldridge. , , Это интересный момент. Возможно (но я не знаю *), что с индексом «id» в индексе только один индекс будет использоваться для соединения с дополнительными столбцами, которые будут отправлены позже. Однако Oracle может сначала получить страницы, а затем выполнить соединение. –

+0

Я уверен, что сначала он будет обращаться к таблице, но каким бы способом это ни было, я думаю, что чистая работа будет ниже без идентификатора индекса - вы также получите более компактный индекс, и COMPRESS может быть полезен также. –