Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
46 / 46 / 1
Регистрация: 14.10.2008
Сообщений: 179

Запрос не подхватывает индекс, который идеально подходит

09.09.2025, 11:05. Показов 1341. Ответов 8

Студворк — интернет-сервис помощи студентам
Привет.

Если очень кратко - есть простой запрос по схеме FROM Таблица1 + JOIN Таблица2
Для Таблицы1 применяется индекс.
Для Таблицы2 - нет, хотя есть прям идеально для него подходящий, хотя бы потому, что он полностью покрывает все столбцы.
Из Таблицы2 отбирается примерно 1/6 всех данных, из плана

Code
1
2
3
(cost=0.00..476439.68 rows=1311205 width=12) 
...
Rows Removed by Filter: 5928296
СУБД берет и просто сканирует:
Code
1
Seq Scan on "Таблица2" (cost=0.00..476439.68 rows=1311205 width=12) (actual time=105.468..6839.486 rows=1327365 loops=1)
Время выполнения около 7 сек.

ПРИ ЭТОМ: параллельное выполнения я отключил (из диагностических соображений), ресурсов у сервера много.

И самое интересное вот в чем.
Если запретить seqscan и удалить все индексы, кроме готового - время становится около 5 сек.
Если еще и запретить nestedloops - юзается hash выигрывается еще секунда... И вот хоть ты тресни.

Вопрос банален: почему так происходит?
Может можно какую-то настройку подкрутить?
Какой-то cost где-то подправить?
По администрированию слабо шарю, честно.

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

Пробовал на PG 15 и 16.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2025, 11:05
Ответы с готовыми решениями:

В Access 2010 нажатие кнопки (и другтие объекты) не подхватывают ни одно событие
Создал простую форму. На нее положил кнопку. По On_click сделал Процедуру обработки события в ввиде...

Самый быстрый запрос что бы узнать, есть ли хотя бы одна подходящая запись в столбце таблицы
Имеется довольно большая БД. Довольно часто для нахождение "Где это лежит?" используем самописную...

Написать запрос, выводящий 2 максимальных результата, если не подходит ни один, выводить текст
Друзья, нужна помощь. Задание: Есть таблица студентов, сдавших ЕГЭ, содержит 3 поля: id, ФИО и...

8
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
09.09.2025, 15:26
а сколько строк в выборке по первой таблице?
0
46 / 46 / 1
Регистрация: 14.10.2008
Сообщений: 179
09.09.2025, 17:22  [ТС]
Swa111, примерно так:

-> Index Only Scan using ... on "Таблица1" (cost=0.43..0.87 rows=1 width=4) (actual time=0.010..0.010 rows=1 loops=393476)

Но прикол также и в том, что даже если просто отбирать из Таблицы2 - он все равно не подхватывает индекс, если все также поотменять, хотя это более логично, чем в случае с JOIN
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
10.09.2025, 11:56
Цитата Сообщение от Vasiliusis Посмотреть сообщение
Но прикол также и в том, что даже если просто отбирать из Таблицы2 - он все равно не подхватывает индекс,
Ну смотрите. (пальцем в небо, общие принципы, не видя всех данных, плана)

В Таблица2 1.327.365 записей, каждая запись по 12 байт, тогда имеем размер данных 16Мб, и если данные лежат на страницах по 8К, то получается, что таблица занимает 2000 страниц на диске.

Построение индекса по всем полям Таблица2 создаст B-дерево, у которого будет 2000 листьев + 2 страницы промежуточного уровня + 1 страница корневая, итого 2003 страницы индекса.

Если предположить, что данные распределены равномерно, то, что бы извлечь 30% данных, то надо пройти по всему дереву, те просканировать 2003 страниц.

Поэтому оптимизатор выбирает более дешевое сканирование всей таблицы 2000 страниц, чем сканирование индекса 2003 страницы.

PS индекс работает обычно, когда в условие отбора попадает 1% от силы 2% данных.
0
46 / 46 / 1
Регистрация: 14.10.2008
Сообщений: 179
10.09.2025, 13:36  [ТС]
PaulWist, ну в случае запроса без джоина я понимаю, тут логика прослеживается.

Но думаю, при обычном сканировании перебирается больше, чем 2000 страниц, т.к. индекс, грубо говоря, покрывает меньше половины данных в строке. Причем (увы, так повелось еще до меня) в таблице есть и длинные строки и TEXT. то есть не факт, что в 8кб уместится весь объем всех страниц, как индекса так и таблицы. Но видимо, у меня так совпало, спасибо за пояснение.

но почему не юзается индекс при наличии джоина, ведь так получается быстрее, ну исходя из того, насколько я мог поубирать лишнее...
0
139 / 105 / 36
Регистрация: 27.07.2022
Сообщений: 357
10.09.2025, 15:09
В постгресе, емнип, в индексах версии строк не хранятся и зачастую всё равно в таблицу идти нужно, проверять? Так что вполне может быть, что индексом дороже
0
46 / 46 / 1
Регистрация: 14.10.2008
Сообщений: 179
11.09.2025, 11:37  [ТС]
katamoto, может объяснить, что значит термин "версии строк"? Это строки? А почему - версии?
Слово "версии" наводит меня упорно на мысли об историчности, типа "можно вернуться к старой - какой-то - версии строки".

Добавлено через 2 часа 39 минут
Решение нашел.
Если у вас SSD (а у меня он) - можно сравнять настройки

seq_page_cost = 1.0
random_page_cost = 1.0

и все будет прям хорошо.

источник тут https://habr.com/ru/companies/... es/576980/
либо в следующей статье (там на странице ищите ссылку)
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
12.09.2025, 02:48
Цитата Сообщение от Vasiliusis Посмотреть сообщение
katamoto, может объяснить, что значит термин "версии строк"? Это строки? А почему - версии?
Слово "версии" наводит меня упорно на мысли об историчности, типа "можно вернуться к старой - какой-то - версии строки".
Если в кратце то при редактировании строк, на самом деле создается ее копия. Эту копию видит только создавший, до тех пор пока не сделает commit. После Commit новую версию строки будут видеть все, а старая перейдет в разряд мертвых и будет занимать место пока за ней не придет vacuum.
Вернуться к старой версии после commit нельзя.
Но в рамках транзакции можно вернутся к старой версии (на начало транзакции) если будет rollback (или ошибка в частности). В этом случае несостоявшиеся новые строки передут в разряд мертвых.

Про оценку стоимости выполнения плана можно почитать в этом
курсе
0
46 / 46 / 1
Регистрация: 14.10.2008
Сообщений: 179
15.09.2025, 17:35  [ТС]
Swa111, а понял, спасибо, копия строки в транзакции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2025, 17:35
Помогаю со студенческими работами здесь

Задачу не могу сделать идеально с двумя условиями хитрыми
есть задача от Яндекса для решения задачи я бы написал 2 разных запроса элементарных! но...

MS Access, SQL, Запрос в запросе, Ошибка "В качестве входных данных запрос должен иметь хотя бы одну таблицу или запрос"
Достаточно давно не работал с SQL, застрял на простом. Нужна помощь Схема данных ...

Индекс под запрос
Какой индекс влепить, чтобы охватил и условия и сортировку? select * from NewUsers where Layer =...

Вернуть количество пользователей, которые подходят под условие
Выбрать количество юзеров у которых все значения AwardedScore>=0 .таблицы связаны по айди(видно...

Какие платформы баз данных больше подходят под быстрый C++?
Сейчас занимаюсь(скорее интересуюсь) разработкой сайта на C++. Скорость вычисления у него...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru