我在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'列應該是外鍵?他們似乎沒有被宣佈爲這樣。 '句子'中的東西有多大?有可能你的緩存很冷,或者服務器的磁盤超載。再試一次。 – Schwern
他們是否應該提高性能?如果會被宣佈爲這樣?該提取僅來自該表,不涉及參與。 '句子'是非常短的字符串,也一次又一次地查詢性能相同的結果。 – Seffy
你有沒有有效的統計數據? - >>'VACUUM ANALYZE domain.examples;'BTW是'e.category_id'低基數列? – wildplasser