2014-01-27 3 views
2

У меня есть вопрос относительно (не) использования уникального индекса. Я использую Oracle 11g.Уникальный индекс (покрытие 3 столбца) не используется в соединении

Таблица A: col1, col2, col3. col1-col2-col3 триплет имеет нескольких столбцов уникальный индекс в таблице А.

Таблица B: colX. colX является первичным ключом таблицы B.

Мой запрос:

SELECT * FROM TABLE_A A 
JOIN TABLE_B B ON A.col1 = B.colX 
WHERE A.col2 = 10 and A.col3 = 20 

Когда я смотрю на план Объяснить в Жаба, я вижу, что «Каждая строка в TABLE_A читается.» (Полный доступ).

Однако, когда я пишу запрос:

SELECT * FROM TABLE_A A 
WHERE A.col1 = 10 AND A.col2 = 20 AND A.col3 = 30 

он использует уникальный индекс.

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

+0

http://en.wikipedia.org/wiki/Database_index#Column_order Читайте о 'составном индексе'. –

+0

Уникальное определение индекса может помочь нам. Я бы предположил, что col2 объявлен до col3, поэтому запрос без col2 принудительно переходит в сканирование таблицы. Если вы будете чаще использовать запросы, такие как 1, вам следует рассмотреть возможность переупорядочения столбцов индекса. – RubberDuck

+1

Если в первом столбце, где указан первый столбец в индексе, будет использоваться индекс (в общем случае). Создайте 'index (col2, col3)', если вам нужен индекс в вашем первом запросе. – Mihai

ответ

0

На TABLE_A, сделать один индекс с col1 только (использовать для присоединиться) и другой индекс с col2 и col3 только (использовать для фильтрации предиката).

Оптимизатор запросов обрабатывает JOIN и фильтрацию как две отдельные операции. Он не будет использовать индекс с col1 в качестве первого столбца для операции фильтрации.

+0

Спасибо, Даниэль, сейчас работает. – yalpertem

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