Oracle и хинты

Mandor
Дата: 12.12.2012 15:31:24
Приветствую.

Бред какой-то...

select
/*+ index(t_doc ind2) */
       d.docdate
  from t_doc d
 where (d.docdate between to_date('01.04.2010', 'dd.mm.yyyy') and to_date('31.05.2010', 'dd.mm.yyyy'))

отдает index range scan, как и хочу, а

select
/*+ index(t_doc ind2) */
       d.docdate,
       d.key
  from t_doc d
 where (d.docdate between to_date('01.04.2010', 'dd.mm.yyyy') and to_date('31.05.2010', 'dd.mm.yyyy'))

уже full scan.

В индексе ind2 есть только docdate.
Кто-то может объяснить, что за бред?
Oracle8.
orawish
Дата: 12.12.2012 15:34:27
Mandor
Приветствую.

Бред какой-то...

select
/*+ index(t_doc ind2) */
       d.docdate
  from t_doc d
 where (d.docdate between to_date('01.04.2010', 'dd.mm.yyyy') and to_date('31.05.2010', 'dd.mm.yyyy'))

отдает index range scan, как и хочу, а

select
/*+ index(t_doc ind2) */
       d.docdate,
       d.key
  from t_doc d
 where (d.docdate between to_date('01.04.2010', 'dd.mm.yyyy') and to_date('31.05.2010', 'dd.mm.yyyy'))

уже full scan.

В индексе ind2 есть только docdate.
Кто-то может объяснить, что за бред?
Oracle8.

нет у вас хинтов в коде
ten
Дата: 12.12.2012 15:53:24
Mandor
select
/*+ index(t_doc ind2) */
       d.docdate,
       d.key
  from t_doc d
 where (d.docdate between to_date('01.04.2010', 'dd.mm.yyyy') and to_date('31.05.2010', 'dd.mm.yyyy'))

уже full scan.

В индексе ind2 есть только docdate.
Кто-то может объяснить, что за бред?
Oracle8.

На пальцах: бегать по индексу, а потом лезть для каждой найденной строки в таблицу оптимизатор посчитал более затратным, чем сразу читать таблицу.
ten
Дата: 12.12.2012 15:56:59
Mandor,
Ну и, как уже указали, неверное написание хинта: 13619945
ten
Дата: 12.12.2012 16:00:44
MazoHist
Дата: 12.12.2012 16:18:56
ten
На пальцах: бегать по индексу, а потом лезть для каждой найденной строки в таблицу оптимизатор посчитал более затратным, чем сразу читать таблицу.

Оптимизатор не будет игнорировать hint, если его применение возможно. А по приведенному плану было как раз видно, что hint не используется, но где ошибка - сразу не разглядел, глаза замылились.
Amberit
Дата: 12.12.2012 16:28:30
Mandor,

+ ко всему вышесказанному, использование хинтов в редких случаях бывает оправдано. Обычно оптимизатор сам хорошо разбирается, каким образом выбрать оптимальный план выполнения запроса. А хинты заставляют оптимизатор идти по жестко указанному пути, который при изменении условий (или данных) может стать неоптимальным...
Vint
Дата: 12.12.2012 16:33:54
Amberit,

"А хинты заставляют оптимизатор идти по жестко указанному пути" - да положить иногда оптимизатору на хинты....)
AMonkeys
Дата: 12.12.2012 16:53:07
Mandor,
Попробуй еще так:
/*+ index(d ind2) */
Amberit
Дата: 12.12.2012 17:54:47
Vint,

Наверное, только в том случае, если оптимизатор не рассматривает ни одного плана с путем, который указывают через хинты.
Иначе вообще не понятно, как эта шайтан-машина понимает, когда можно положить на хинт, а когда нет...