Индекс на Oracle 11g Вопрос
Вопрос
У меня есть таблица (мужчины) с 900 000 записей.
В этой таблице у меня есть поле IP
и Tdate
.
Когда я запускаю запрос:
select * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
Это занимает много времени, пока я не получу результат.
Я стараюсь сделать индекс таким:
create index
my_in
on
MEN (IP,Tdate );
Но как запустить запрос, чтобы получить быстрый результат?
Я пробую это:
select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
и получить ошибку: ORA-00904
Решение
Вы не используете имя индекса (my_in) в выборе. Сама база данных выяснит для использования индекса. Таким образом, вы должны просто сделать то же самое, что и в своем первом примере.
Другие советы
в вашем запросе
select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
my_in - это имя индекса. Если вы хотите принудительно использовать индекс, то вы можете намекнуть на свой запрос
select /*+INDEX(My_in MEN) */ * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
Это не действителен SQL. My_in
это имя вашего индекса.
Попробуйте еще раз с:
select *
from MEN
where IP = '1.1.1.1'
and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY');
В качестве альтернативы, если вы хотите узнать, будет ли сервер использовать план, используя ваш недавно созданный индекс, вы можете проверить выход explain
Команда:
explain plan for
select *
from MEN
where IP = '1.1.1.1'
and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY');
Посмотрите на документацию Oracle на Объясните план. Анкет Это поможет вам с этим и многими другими оптимизациями SQL.