Postgresql。优化从大表中检索不同值

问题描述 投票:0回答:2

我有一个包含 40 多列的非规范化表(约 150 万行,1 GB)。

CREATE TABLE tbl1 (
  ...
  division_id integer,
  division_name varchar(10),
  ...
);

我需要加快查询速度

SELECT DISTINCT division_name, division_id 
FROM table 
ORDER BY division_name;

查询仅返回约 250 行,但速度非常慢,因为表的大小。

我尝试创建索引:

create index idx1 on  tbl1 (division_name, division_id)

但目前的执行计划:

explain analyze SELECT Distinct division_name, division_id FROM tbl1 ORDER BY 1;

          QUERY PLAN                                                                    
-----------------------------------------------------------------
Sort  (cost=143135.77..143197.64 rows=24748 width=74) (actual time=1925.697..1925.723 rows=294 loops=1)
Sort Key: division_name
    Sort Method: quicksort  Memory: 74kB
    ->  HashAggregate  (cost=141082.30..141329.78 rows=24748 width=74) (actual time=1923.853..1923.974 rows=294 loops=1)
             Group Key: division_name, division_id
             ->  Seq Scan on tbl1  (cost=0.00..132866.20 rows=1643220 width=74) (actual time=0.069..703.008 rows=1643220 loops=1)
Planning time: 0.311 ms
Execution time: 1925.883 ms

有什么建议为什么索引不起作用或者如何以其他方式加快查询速度?

服务器 Postgresql 9.6。

附注是的,表有 40 多列并且非标准化,但我知道决策的所有优点和缺点。

更新1

@a_horse_with_no_name 建议使用真空分析而不是分析来更新表统计信息。现在查询平原是:

QUERY PLAN                                                                                
------------------------
 Unique  (cost=0.55..115753.43 rows=25208 width=74) (actual time=0.165..921.426 rows=294 loops=1)
   ->  Index Only Scan using idx1 on tbl1  (cost=0.55..107538.21 rows=1643044 width=74) (actual time=0.162..593.322 rows=1643220 loops=1)
         Heap Fetches: 0

好多了!

postgresql query-optimization distinct postgresql-9.6
2个回答
4
投票

索引可能只有在 PostgreSQL 选择“仅索引扫描”时才会有帮助,这意味着它根本不必查看表数据。

通常 PostgreSQL 必须检查表数据(“堆”)以查看某行对于当前事务是否可见,因为可见性信息不存储在索引中。

但是,如果表没有太大变化并且最近被修改过,则 PostgreSQL 知道大多数页面仅包含每个人都可见的项目(有一个“可见性地图”来跟踪该信息),然后扫描索引可能会更便宜。


尝试在表上运行

VACUUM

,看看是否会导致使用仅索引扫描。


除此之外,没有办法加速这样的查询。


0
投票
http://zogovic.com/post/44856908222/optimizing-postgresql-query-for-distinct-values

© www.soinside.com 2019 - 2024. All rights reserved.