2011-01-18 5 views
1

私は非常に大きなテーブルを持っています。非常に高いオフセットでいくつかの製品を選択する必要があります(下記例)。インデックスとパフォーマンスに関するPostgresqlのマニュアルは、ORDER BY +の最終的な条件で使用されるカラムにインデックスを作成することを提案しています。すべてが桃色で、並べ替えは使用されていません。高いオフセット値の場合、LIMITは非常に高価です。誰でも何が原因なのか考えていますか?下限値が非常に高い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) 

答えて

5

index_for_listing_by_name_activeインデックスは、あまり助けに行くのではありません。アクティブな商品に限定して条件付きインデックスを作成してみてください:

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

これまでのところよく見えますが、私は今夜もお世話になります。おかげでたくさん! –

+1

単にインデックスの列の順序を切り替えると言っているのではなく、条件付きのインデックスを覚えている人がいるのを見て嬉しいです。 – araqnid

+0

テストデータベースで列の順序を入れ替えようとしましたが、実際には、 。私はその物語が何であるか分かりませんが、私はそれが助けられると期待していました。 – pmdboi

関連する問題