Индекс по внешнему ключу не выбирается в запросах на присоединение - PullRequest
1 голос
/ 05 июля 2011

Рассмотрим пример EMP, DEPT. Очень часто запрашивать таблицу EMP в контексте deptno. Если вы часто запрос:

select * from dept, emp
 where emp.deptno = dept.deptno and dept.deptno = :X;

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

Есть идеи, как использовать индекс для столбца внешнего ключа?

Ответы [ 2 ]

4 голосов
/ 05 июля 2011

Таблицы EMP и DEPT не особенно хороши для использования, когда вы пытаетесь понять поведение оптимизатора.Они настолько малы, что оптимизатор будет часто правильно определять, что полное сканирование таблицы более эффективно, чем доступ по индексу.Кроме того, существует относительно немного различных значений DEPTNO, поэтому оптимизатор знает, что ему придется извлекать относительно большой процент строк из таблицы EMP.Поскольку в таблицах мало строк и вам нужно извлечь большую часть строк для любого заданного значения DEPTNO, сканирование таблицы будет более эффективным.

Если бы таблицы были больше и их было большеВ отделах оптимизатор с большей вероятностью определит, что использование индекса будет более эффективным.

0 голосов
/ 05 июля 2011

A) Измените синтаксис для использования правильного объединения:

select *
from dept
join emp on emp.deptno = dept.deptno
where dept.deptno = :X;

B) Определите индекс для dept.deptno, поскольку это основной фильтр (предложение where)

CREATE INDEX DEPT_DEPTNO_IDX ON DEPT(DEPTNO);

Это должно заставить его летать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...