Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заюзать индекс / 11 сообщений из 11, страница 1 из 1
20.10.2016, 14:36:45
    #39330683
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
Есть табличка 10-ки млн записей.
Делаем запрос:
Код: plsql
1.
2.
3.
4.
5.
   SELECT id, doc_date
     FROM (SELECT /*+ index(d documents_i)*/id, doc_date,
                  ROW_NUMBER() OVER(PARTITION BY id ORDER BY 1) rn
             FROM documents d) 
    WHERE rn = 1


В индекс documents_i создан по (id, doc_date).
В таблице есть еще куча объемных полей.
Плюс индекс уже как бы отсортирован, но при этом оракл показывает, что хочет фулсканить таблицу, а не индекс.
При этом понятно, что ему придется прочитать гораздо больше блоков с диска, чем, если бы он читал индекс.
Больше того, на аналогичной таблице такого же плана запрос фулсканит индекс, хотя в той таблице нет ни PK по ID, ни NOT NULL ограничения на ID (так же как и на documents).

Вопрос: если отбросить сбор статистики, не сталкивался, но возможно ли принудительно указать ораклу, чтобы он в любом случае использовал индекс (по хинту тоже не подхватывается).
...
Рейтинг: 0 / 0
20.10.2016, 15:04:34
    #39330729
ORA__SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
Avotge,
Код: sql
1.
id и/или doc_date nullable
...
Рейтинг: 0 / 0
20.10.2016, 15:16:55
    #39330748
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
ORA__SQLid и/или doc_date nullable
Да, как уже сказал, id nullable, хотя по факту не имеет пустых значений.
Попробую создать констрейнт,
но интересно, почему на аналогичных таблицах (где Id тоже nullable) такой же запрос сканит индекс, а не таблицу?
...
Рейтинг: 0 / 0
20.10.2016, 15:18:36
    #39330752
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
Avotge почему на аналогичных таблицах (где Id тоже nullable) такой же запрос сканит индекс, а не таблицу?
Потому что предикат.
...
Рейтинг: 0 / 0
20.10.2016, 15:20:01
    #39330755
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
Avotge
Код: plsql
1.
OVER(… ORDER BY 1)

Включи мозг.
...
Рейтинг: 0 / 0
20.10.2016, 15:30:41
    #39330772
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
ElicВключи мозг.
Было бы что включать )
Так и что, что order by 1, пишу
Код: plsql
1.
partition by id order by id


Ничего не меняется :( Может и туплю конечно.
И потом, говорю же, - такой же запрос на других аналогичных таблицах работает по индексу.
andrey_anonymousПотому что предикат.
Без предиката тоже пробовал и на таблицах, и опять же на таблицах, где работа по индексу без предиката что с предикатом, что без индекс подхватывается.
Пока остается только констрейнт добавить, потом глянуть.
...
Рейтинг: 0 / 0
20.10.2016, 15:33:55
    #39330777
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
AvotgeБез предиката тоже пробовал и на таблицах, и опять же на таблицах, где работа по индексу без предиката что с предикатом, что без индекс подхватывается
Вот с этого места поподробнее.
Если я правильно понял, утверждается что есть ситуация, в которой:
- индекс содержит только nullable поля
- в запросе нет предикатов, позволяющих оптимизатору понять, что null-значения не нужны
- индекс подхватился

Пример в студию.
...
Рейтинг: 0 / 0
20.10.2016, 15:34:49
    #39330780
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
AvotgeТак и что, что order by 1RTFM Analytic Functions: Restrictions on the ORDER BY Clause (FAQ)
...
Рейтинг: 0 / 0
20.10.2016, 15:48:02
    #39330798
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
авторЕсли я правильно понял, утверждается что есть ситуация, в которой:
- индекс содержит только nullable поля
- в запросе нет предикатов, позволяющих оптимизатору понять, что null-значения не нужны
- индекс подхватился
Пример в студию.
Фух, уже расстроился, что за чудеса такие, оказалось, в упор не заметил, все верно - где индекс подхватывается ID все-таки не nullable. Вопрос снят, сори.
Elic, спасибо, но по ссылке, так и не понял что может быть не так с order by 1 :( (мне же тут как бы и не важна сортировка)
...
Рейтинг: 0 / 0
20.10.2016, 15:49:24
    #39330801
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
Avotge(мне же тут как бы и не важна сортировка)Да ну?
...
Рейтинг: 0 / 0
20.10.2016, 15:58:16
    #39330813
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заюзать индекс
ElicДа ну?
То есть не важно какую запись из окна дублей по ID надо забрать.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заюзать индекс / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]