У меня есть стол EMPLOYEE(EMP_ID, EMP_NAME, DESC, SALARY)
, и я хочу получить всех сотрудников, которые могут выполнять фокусы.Способность творить магию классифицируется как талант и талант, если каждый сотрудник хранится в конце каждой записи DESC
каждого сотрудника.
Если у сотрудника есть какой-либо талант, то DESC
у этого сотрудника будет 'Talent: __talent_here__'
. Например, Джо умеет жонглировать, тогда его описание будет примерно таким: 'Joe Doe, works here since 2011. Talent: juggling'
.Я могу предположить, что в каждом описании есть только один экземпляр строкового литерала 'Talent: '
, таланты всегда хранятся в конце DESC
, и не у всех сотрудников есть таланты.Я также хочу отсортировать сотрудников, извлеченных по их именам, и хочу, чтобы только первые 50 отсортированных значений
Это утверждение SELECT
, которое у меня сейчас есть.
SELECT * FROM (
SELECT E.EMP_NAME FROM EMP E
WHERE INSTR(E.DESC, 'Talent: ') > 0
AND INSTR(SUBSTR(E.DESCRIPTION, INSTR(E.DESC, 'Talent: ')), 'magic') > 0
ORDER BY E.EMP_NAME ASC
) WHERE ROWNUM <= 50
/
Это SELECT
утверждение работает отлично.Теперь я хочу создать индекс запроса для улучшения времени выполнения:
CREATE INDEX MAGICIANS ON EMP(
INSTR(DESCRIPTION, 'Talent: '),
INSTR(SUBSTR(DESCRIPTION, INSTR(DESCRIPTION, 'Talent: ')), 'magic'))
/
Но этот индекс, похоже, не работает.В моей таблице около 9000 записей, и до создания индекса время выполнения оператора SELECT составляет 00.50 секунд.После создания индекса он становится около 00,49 секунд.Я экспериментировал с индексом, и иногда время выполнения после создания индекса даже немного хуже, чем было раньше.(от 00.50 до 00.52 секунд)
Кто-нибудь знает, почему это происходит?
Спасибо всем.