sql – 提高查詢速度:簡單的SELECT在大postgres表中
我在Postgres資料庫的SELECT查詢中遇到問題.
我有一個帶有兩個整數列的表:(int1,int2)
這張表有大約7000萬行.
我需要在這種環境中進行兩種簡單的SELECT查詢:
SELECT * FROM table WHERE int1=X; SELECT * FROM table WHERE int2=X;
這兩個選擇在這7000萬個中返回了大約10.000行.為了儘可能快地工作,我考慮使用兩個HASH索引,每列都有一個.不幸的是,結果不是那麼好:
QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on lec_sim(cost=232.21..25054.38 rows=6565 width=36) (actual time=14.759..23339.545 rows=7871 loops=1) Recheck Cond: (lec2_id = 11782) ->Bitmap Index Scan on lec_sim_lec2_hash_ind(cost=0.00..230.56 rows=6565 width=0) (actual time=13.495..13.495 rows=7871 loops=1) Index Cond: (lec2_id = 11782) Total runtime: 23342.534 ms (5 rows)
這是其中一個查詢的EXPLAIN ANALYZE示例.大概需要23秒鐘我的期望是在不到一秒鐘內得到這些資訊.
這些是Postgres db config的一些引數:
work_mem = 128MB shared_buffers = 2GB maintenance_work_mem = 512MB fsync = off synchronous_commit = off effective_cache_size = 4GB
任何幫助,評論或想法將非常感激.
先謝謝你.
將我的意見提取到一個答案中:這裡的索引查詢非常快 – 所有的時間都用於檢索實際的行. 23秒/ 7871行=每行2.9毫秒,這對於檢索分散在磁碟子系統中的資料是合理的.尋求緩慢您可以a)將您的資料集合在RAM中,b)購買固態硬碟,或c)提前組織資料,以儘量減少尋找.
PostgreSQL 9.2有一個名為PostgreSQL_9.2#Index-only_scans" rel="nofollow,noindex" target="_blank">index-only scans 的功能,允許它(通常)回答查詢而不訪問表.您可以將此與btree index屬性組合,自動維護訂單,使此查詢更快.你提到int1,int2和兩個浮點數:
CREATE INDEX sometable_int1_floats_key ON sometable (int1, float1, float2); CREATE INDEX sometable_int2_floats_key ON sometable (int2, float1, float2); SELECT float1,float2 FROM sometable WHERE int1=<value>; -- uses int1 index SELECT float1,float2 FROM sometable WHERE int2=<value>; -- uses int2 index
還要注意,這並不奇怪地擦除磁碟尋找,它只是從查詢時間移動到插入時間.由於您正在複製資料,因此還會佔用儲存空間.不過,這可能是你想要的權衡.
http://stackoverflow.com/questions/13234812/improving-query-speed-simple-select-in-big-postgres-table