私はCentOS 6.7でpostgresql 9.4を実行しています。テーブルの一つは、レコードの数百万人の多くが含まれ、これはDDLです:PostgreSQL - インデックスを使用した非常に遅いフェッチ
CREATE TABLE domain.examples (
id SERIAL,
sentence VARCHAR,
product_id BIGINT,
site_id INTEGER,
time_stamp BIGINT,
category_id INTEGER,
CONSTRAINT examples_pkey PRIMARY KEY(id)
)
WITH (oids = false);
CREATE INDEX examples_categories ON domain.examples
USING btree (category_id);
CREATE INDEX examples_site_idx ON domain.examples
USING btree (site_id);
データはページネーションを使用して、私たちは1000年、レコードのバルクを取得していることを行う消費アプリケーション。しかし、インデックス付きの列をフェッチしても、取得時間は非常に遅いです。
explain analyze
select *
from domain.examples e
where e.category_id = 105154
order by id asc
limit 1000;
Limit (cost=0.57..331453.23 rows=1000 width=280) (actual time=2248261.276..2248296.600 rows=1000 loops=1)
-> Index Scan using examples_pkey on examples e (cost=0.57..486638470.34 rows=1468199 width=280) (actual time=2248261.269..2248293.705 rows=1000 loops=1)
Filter: (category_id = 105154)
Rows Removed by Filter: 173306740
Planning time: 70.821 ms
Execution time: 2248328.457 ms
なぜ低速クエリが発生していますか?どのように改善することができますか?
ありがとうございます!私は本当に
は、これらすべての '_id'の列が外部キーであるために仮定されていますか?彼らはそのように宣言されていないようです。 'sentence'の内容はどれくらいですか?キャッシュが寒かったり、サーバーのディスクが過負荷になっている可能性があります。もう一回やってみよう。 – Schwern
そのように宣言されると、パフォーマンスが向上するはずですか?フェッチはそのテーブルからのみ行われ、結合は含まれません。 'sentence'は非常に短い文字列であり、何度も何度も同じ結果が得られます。 – Seffy
有効な統計情報はありますか? - >> 'VACUUM ANALYZE domain.examples;' BTWはカーディナリティの低い 'e.category_id'ですか? – wildplasser