1

私は製品を備えた非常に大きなテーブルを持っています。非常に高いオフセットでいくつかの製品を選択する必要があります (下の例)。インデックスとパフォーマンスに関する 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)
4

1 に答える 1

5

結果セットのindex_for_listing_by_name_active商品が必ずしもインデックス内で隣接しているとは限らないため、ここにあるインデックスはあまり役に立ちません。アクティブな製品のみに名前で条件付きインデックスを作成してみてください。

CREATE INDEX index_for_listing_active_by_name
  ON product_slugs (name)
  WHERE product_slugs.active = 1;
于 2011-01-18T23:22:42.260 に答える