указатель на вопрос оракула 11g - PullRequest
2 голосов
/ 09 ноября 2010

У меня есть таблица (MEN) с 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

Ответы [ 3 ]

5 голосов
/ 09 ноября 2010

Вы не используете индексное имя (My_in) в выборе. Сама база данных выяснит, как использовать индекс. Так что вы должны просто сделать тот же выбор, что и в первом примере.

1 голос
/ 09 ноября 2010

в вашем запросе

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')
1 голос
/ 09 ноября 2010

Это недопустимый 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.

...