Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему лучшее использование индексов при таком переписывании запроса / 14 сообщений из 14, страница 1 из 1
07.05.2020, 12:36
    #39954947
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Приветствую!


Запрос значительно тормозил и оптимизатор не хотел использовать индексы

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select *
from 
   protocol p
where 
   p.ID > 170834164 and
   ... -- << почему-то индекс, специально созданный сля этого случая, не используется
order by 
   p.ID desc



удивился, что индекс не используется. Решил переписать запрос на аналогичный по смыслу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select *
from 
   protocol p
where 
   exists(select 1 from dual where p.ID > 170834164) and
   ... -- и вдруг индекс стал использоваться
order by 
   p.ID desc



и индекс вдруг вкючился. Но почему?
...
Рейтинг: 0 / 0
07.05.2020, 15:08
    #39954986
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Кроик Семён,

это не имеет значения, да и ответ на этот вопрос даст разглядывания плана запроса.

Имеет значение совершенно другое - кто тебя так перепугал, что вдруг решил, что использование индекса "лучшее".
А если, не дай бог, в какой книжке вредных советов вычитал, то вот тебе разумный совет:
Сожги ту книжку в печи немедленно , чтобы самому не читать и у других возможности набраться безумия не было.
...
Рейтинг: 0 / 0
07.05.2020, 15:35
    #39954992
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Кроик Семён,

https://www.sql.ru/faq/faq_topic.aspx?fid=344


....
stax
...
Рейтинг: 0 / 0
07.05.2020, 15:55
    #39955002
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
booby
Имеет значение совершенно другое - кто тебя так перепугал, что вдруг решил, что использование индекса "лучшее".

перепугать так его могло знание поддерживаемой системы, и особенностей данных, в этой системе хранящихся.
...
Рейтинг: 0 / 0
07.05.2020, 16:03
    #39955004
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
booby,

Дело не в прочитанных книгах :) , а в невероятном замедлении запросов если индекс не используется


-
...
Рейтинг: 0 / 0
07.05.2020, 16:16
    #39955007
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Кроик Семён,

приложенные запросы отличаются от стартового отсутствием сортировки. Что в итоге вам надо то?
...
Рейтинг: 0 / 0
07.05.2020, 16:36
    #39955012
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Кроик Семён,

автора в невероятном замедлении запросов если индекс не используется
похоже, ты даже не смотришь в то, что выкладываешь.
И это правильно.
Просто добавь rownum = 1 в исходный запрос - жизнь и наладится.
...
Рейтинг: 0 / 0
07.05.2020, 16:55
    #39955019
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
автор Почему лучшее использование индексов при таком переписывании запроса



Видно, что при использовании предиката
Код: plsql
1.
tbl = 'SCHLIESSANLAGE'

подхватывается индекс IDX_PROTOCOL__SUCH_TBLFK, тогда как с предикатом
Код: plsql
1.
tbl = 'SCHLIESSANLAGE' and ID > 170834164

подхватывается SYS_C003161, потому что стоимость его сканирования 4680 дешевле, чем у предыдущего 5000.
Почему медленнее - недостаточно информации, предполагаю это index skip scan в обёртке index range scan. Тебе стоит приложить вывод DISPLAY_CURSOR() с предикатами и run time статистиками
...
Рейтинг: 0 / 0
07.05.2020, 17:07
    #39955022
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Alexander Anokhin,

да. я был неправ.

вероятно, это PK

нужно использовать что-то вроде
Код: plsql
1.
and  lnnvl(ID <= 170834164)


вместо and ID > 170834164
или (ID + 0) > 170834164
...
Рейтинг: 0 / 0
07.05.2020, 17:23
    #39955028
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Провел тест, выбрал другой ID, гораздо более меньший, чтобы запрос начал выдавать больше одной строки.
И интересно, вариант с EXISTS (и ORDER BY) стал резко медленее .


Всем большое спасибо
...
Рейтинг: 0 / 0
07.05.2020, 17:26
    #39955030
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Кроик Семён
...

Всем большое спасибо

ой...

ох, книжки надо бы жечь, но не все...
...
Рейтинг: 0 / 0
07.05.2020, 17:39
    #39955033
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
...
Рейтинг: 0 / 0
07.05.2020, 17:41
    #39955034
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
вобщем, скорость выполнения запроса (с выгрузкой всех строк) почти одинаковая
...
Рейтинг: 0 / 0
08.05.2020, 09:42
    #39955181
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему лучшее использование индексов при таком переписывании запроса
Кроик Семён
Провел тест, выбрал другой ID, гораздо более меньший, чтобы запрос начал выдавать больше одной строки.

конечно, селективность меняется
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему лучшее использование индексов при таком переписывании запроса / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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