Не работает индексация в основном 0 столбцах

#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.