#postgresql #partial-index
#postgresql #частичный индекс
Вопрос:
У меня возникли проблемы с попыткой использовать индекс в моей таблице.
Для таблицы items
у меня есть столбец с именем market
. Если market
= 0, то он не продается — если это значение больше 0 (например, 100), он продается за 100 долларов.
Однако у меня есть десятки миллионов строк элементов, которые не продаются. Вероятно, одновременно продается около 1000 товаров (с указанием цены).
Я пытаюсь выполнить быстрый запрос для выбора всех строк, в которых market больше 0;
SELECT market FROM items WHERE market > 0
.
Однако это занимает относительно много времени и использует сканирование SEQ вместо индекса, который у меня есть market
. Буду признателен за любую помощь или другой подход к моему вопросу.
Комментарии:
1. Пожалуйста, опубликуйте определение таблицы с индексами для вашей таблицы
items
2. Работает для меня. Вы провели ВАКУУМНЫЙ АНАЛИЗ и какую версию PostgreSQL вы используете? Если вам нужна помощь в интерпретации ОБЪЯСНЕНИЯ АНАЛИЗА, вам нужно будет показать его нам.
3. Конечно, я использую версию 11, и вот что я получаю:
[<Record QUERY PLAN='Seq Scan on items (cost=0.00..323343.44 rows=12443505 width=75) (actual time=1811.756..1811.763 rows=1 loops=1)'>, <Record QUERY PLAN=' Filter: (market <> 0)'>, <Record QUERY PLAN=' Rows Removed by Filter: 12506034'>, <Record QUERY PLAN='Planning Time: 0.240 ms'>, <Record QUERY PLAN='Execution Time: 1811.795 ms'>]
— извините за формат, я печатаю его с помощью Python
Ответ №1:
Вы можете записать частичный индекс в свою таблицу items
CREATE INDEX idx_items_inactive
ON customer(market)
WHERE market> 0;
Он будет использовать сканирование индекса в случае запроса, упомянутого в вопросе
Комментарии:
1. К сожалению, я попробовал это, и он все еще использует SEQ scan … однако я еще не запустил это в производство. Это означает, что все элементы в настоящее время отсутствуют в списке (market = 0), за исключением нескольких, с которыми я тестирую (таким образом, это означает, что около 5 элементов, у которых market > 0 в 8 миллионах строк.) Может ли это повлиять на это?
2. Есть ли у вас какой-либо другой индекс в этой таблице
3. Обычно у меня 1 другой индекс в этой таблице — индекс для user_id, так как мне нужно назначить каждый элемент пользователю. Однако я удалил его в целях тестирования, и, похоже, он по-прежнему показывает то же самое — запрос проверки SEQ в EXPLAIN ANALYZE.