Индексы в postgresql

1. user1048558 24.06.22 15:13 Сейчас в теме
Добрый день коллеги!

Задался вопросом оптимизации одного запроса и столкнулся с такой историей.

Дано:
Иерархический справочник, дополнительных индексов не создавалось, в справочнике примерно 40 групп и 500 элементов

Необходимо:
Сделать запрос к элементам определенной группы и выбрать все реквизиты этих элементов

Решение:
Казалось бы простая задача, но вопрос возник по индексам. Стандартный индекс (для иерархического справочника), который 1С создает сама - это [Родитель + ЭтоГруппа + ...], т.е. индекс должен сработать если в условии будут поля Родитель или Родитель + ЭтоГруппа, и все вроде бы так срабатывает "index scan", и если добавить в условие ПометкаНаУдаление, то по идее индекс работать не должен (по крайне менее так до сих пор написано в ИТС), но индекс все равно отрабатывает, добавляется лишь условие по фильтру, так вот почему?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 24.06.22 15:31 Сейчас в теме
(1) Если полное совпадение условий и индекса - index seek, если доп. условие - index scan. Если не попадает в индекс - table scan.
3. user1048558 24.06.22 16:42 Сейчас в теме
(2) не совсем согласен, на сколько я помню для "index seek" это при полном покрытии, должно не только условие подходить, но и выборка и сортировка под таблицу индекса, да и на практике как я и говорил в первом случае тоже выдает "index scan" (когда Родитель + ЭтоГруппа)
10. booksfill 24.06.22 18:13 Сейчас в теме
(3)
Не уверен, но index seek при поиске данных и index scan при сортировке никоим образом друг другу не мешают.
Оптимизатор, в определенных случаях, может использовать один проход по индексу, и для поиска и для сортировки, тогда получим index scan.

Вы ничего про сортировку не говорили, и утверждаете, что имеете не clasterd index scan, а просто index scan.

Поэтому делаем вывод, что в первом случае index scan получили не из-за сортировки, а просто потому, что делать index seek and nested loops оптимизатору показалось менее оптимальным, чем простой scan.

Теперь по второму случаю - тут я не понял, кто вам сказал, что при неполном покрытии индекса, если остальные условия заданы индекс не используется, понятия не имею. Именно при неполном покрытии индекса и получаем либо index scan либо table scan.
11. user1048558 24.06.22 18:32 Сейчас в теме
(10)

Я думал примерно в этом же направлении, что с учетом того что записей в таблице мало, планировщик решил использовать index scan, если сократить запрос, например выбирать только родителя с темеже условиями, то срабатывает как раз "index seek". Кластерный был бы, по идее если условие из ссылки (на сколько я помню).
12. redfred 24.06.22 18:40 Сейчас в теме
(1)
если добавить в условие ПометкаНаУдаление, то по идее индекс работать не должен


Почему не должен?
13. user1048558 24.06.22 18:45 Сейчас в теме
(12)

Когда-то читал в 1С ИТСке, что типа, для индекс должен содержать все поля перечисленные в условии. Возможно не правильно понял.
14. redfred 24.06.22 18:59 Сейчас в теме
(13) Если фильтруется не по всем полям, из которых состоит индекс, то это не значит, что он не может быть использован. Вы не получите seek, если у вас пропуск в каком-то поле будет, но scan запросто может быть
15. user1048558 24.06.22 19:06 Сейчас в теме
16. redfred 24.06.22 19:47 Сейчас в теме
(15) Слегка ввёл вас заблуждение, кстати. Там вполне и seek может быть, если в запросе есть фильтрация по самом первому полю индекса, а пропуски уже после пойдут. Но вот если только по последующим, то уже точно scan
4. user1048558 24.06.22 17:07 Сейчас в теме
Чтобы не быть голословным вот результаты

1. В связке Родитель + ЭтоГруппа



2. В связке Родитель + ЭтоГруппа + ПометкаНаУдаление

Прикрепленные файлы:
5. Bukaska 140 24.06.22 17:57 Сейчас в теме
(4)Сделайте картинки вложением на форум, а то не видать, вложения недоступны.
6. user1048558 24.06.22 18:00 Сейчас в теме
(5) там ниже я добавил как вложение, при открытии открывает все 4 но первые две можно промотать
7. Bukaska 140 24.06.22 18:01 Сейчас в теме
(6)У меня две открывает, две нет
8. vikad 130 24.06.22 18:01 Сейчас в теме
(6) я вам все-таки отредактировала сообщение, чтобы не было внешних ссылок
9. user1048558 24.06.22 18:10 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот