Очень высокая стоимость за низкий предел LIMIT / высокий OFFSET - PullRequest
1 голос
/ 19 января 2011

У меня очень большой стол с продуктами. Мне нужно выбрать несколько продуктов с очень высоким смещением (пример ниже). В руководстве Postgresql по индексам и производительности предлагается создать индекс по столбцу, который используется в возможных условиях ORDER BY + Все персиковое, сортировка не используется. но для больших значений смещения LIMIT очень дорог. Кто-нибудь знает, что может быть причиной этого?

Следующий запрос может выполняться несколько минут.

Indexes:
"product_slugs_pkey" PRIMARY KEY, btree (id)
"index_for_listing_by_default_active" btree (priority DESC, name, active)
"index_for_listing_by_name_active" btree (name, active)
"index_for_listing_by_price_active" btree (master_price, active)
"product_slugs_product_id" btree (product_id)

EXPLAIN SELECT * FROM "product_slugs" WHERE ("product_slugs"."active" = 1) ORDER BY product_slugs.name ASC LIMIT 10 OFFSET 14859;
                                                       QUERY PLAN                                                        
-------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=26571.55..26589.43 rows=10 width=1433)
   ->  Index Scan using index_for_listing_by_name_active on product_slugs  (cost=0.00..290770.61 rows=162601 width=1433)
         Index Cond: (active = 1)
(3 rows)

1 Ответ

5 голосов
/ 19 января 2011

Индекс index_for_listing_by_name_active, который у вас есть, мало чем поможет, поскольку продукты в наборе результатов не обязательно будут смежными в индексе. Попробуйте создать условный индекс по имени только для тех продуктов, которые активны:

CREATE INDEX index_for_listing_active_by_name
  ON product_slugs (name)
  WHERE product_slugs.active = 1;
...