Выбор оптимального индекса для SQL-запроса - PullRequest
0 голосов
/ 17 марта 2019

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

У нас есть следующее соотношение:

Emp (id, name, age, sal, ...)

И следующий запрос:

SELECT id
FROM Emp
WHERE age > (select max(sal) from Emp);

Затем мы должны выбрать индекс, который был бы хорошим оптимизатором запросов. Мой ответ будет просто использовать Emp(age), но решение вопроса будет

Emp(age)

&

Emp(sal)

Как получилось, что есть 2 индекса? Кажется, я не могу понять, зачем тебе нужно больше, чем атрибут возраста ..

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Конечно, вы понимаете, что запрос бессмысленный, сравнивая age с sal (что, вероятно, является зарплатой). Тем не менее, два индекса подходят для:

SELECT e.id
FROM Emp e
WHERE e.age > (select max(e2.sal) from Emp e2);

Я добавил псевдонимы таблиц, чтобы подчеркнуть, что запрос дважды ссылается на таблицу Emp.

Чтобы получить максимум sal из таблицы, вы хотите индекс на emp(sal). Максимум - это простая операция поиска по индексу.

Тогда вы хотите сравнить это с age. Ну, для сравнения с age вы хотите индекс на emp(age). Это совершенно отдельная ссылка на emp, которая не имеет ссылки на sal, поэтому вы не можете поместить два столбца в один индекс.

Индекс на age может быть необязательным. Запрос может возвращать много строк - и таблицы, которые возвращают много строк, обычно не получают вторичного индекса. Единственный случай, когда он может извлечь выгоду из индекса, это если age является кластеризованным индексом (то есть обычно первым столбцом в первичном ключе). Однако я бы не рекомендовал такую ​​структуру индексации.

1 голос
/ 17 марта 2019

вам нужны оба индекса для достижения оптимальной производительности

1) подзапрос (выберите max (sal) из Emp) получит выгоду от индексации Emp (sal), потому что по древовидному индексу получение max будет намного быстрее

2) внешний запрос должен выполнить фильтрацию по Emp (возрасту), что также дает выгоду от древовидного индекса

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