powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заюзать индекс
11 сообщений из 11, страница 1 из 1
Заюзать индекс
    #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
Заюзать индекс
    #39330729
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge,
Код: sql
1.
id и/или doc_date nullable
...
Рейтинг: 0 / 0
Заюзать индекс
    #39330748
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ORA__SQLid и/или doc_date nullable
Да, как уже сказал, id nullable, хотя по факту не имеет пустых значений.
Попробую создать констрейнт,
но интересно, почему на аналогичных таблицах (где Id тоже nullable) такой же запрос сканит индекс, а не таблицу?
...
Рейтинг: 0 / 0
Заюзать индекс
    #39330752
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge почему на аналогичных таблицах (где Id тоже nullable) такой же запрос сканит индекс, а не таблицу?
Потому что предикат.
...
Рейтинг: 0 / 0
Заюзать индекс
    #39330755
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avotge
Код: plsql
1.
OVER(… ORDER BY 1)

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


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

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


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