2016-11-26 5 views
1

Пусть следующий SQL псевдокода:Индексов присоединиться с фильтром

select ... from A join B 
on A.serial=27 and B.serial=34 and A.id=B.id; 

Учитывая, что столы большие, мне нужно использовать индексы для обоих serial, и, очевидно, условия объединения A.id=B.id. В идеале, мне нужны фильтры, применяемые до объединения, поскольку в результате фильтров дается намного меньше строк, чем фильтр одной таблицы, затем присоединяются, а затем фильтруются второй.

Мой вопрос: какая комбинация индексов будет хорошо для этой ситуации? возможно, два композита на A и B в форме (serial id)?

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

+1

Ваш запрос неверен. Вы получите все строки A. –

+0

Я хочу всех строк! – Alex

+1

"нужны фильтры, применяемые до объединения, так как в результате фильтров получается гораздо меньше строк, чем фильтрация одной таблицы, затем присоединяются, а затем фильтруются второй". - Вы не фильтруете A, только B –

ответ

1

Это Oracle, а не MySQL.
Вам не нужны индексы для id столбцов для присоединиться к цели, однако -
это хорошая идея, чтобы определить ID столбцов в качестве первичных ключей, и это неявно создает уникальные индексы

Вам нужны индексы в serial столбцах

Create index A_IX_SERIAL on A (SERIAL); 
Create index B_IX_SERIAL on B (SERIAL); 

Ps Сколько стоит «намного меньше строк»?
Как много строк возвращаются, становится менее хорошей идеей использовать индекс.

+0

Извините, но почему нет необходимости индексировать объединенные столбцы? – Alex

+1

@Alex, потому что Oracle в отличие от MySQL поддерживает хэш-соединение. –

+0

Очень интересно ... поддерживает ли хэш поддержка нескольких соединенных столбцов? – Alex

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