简单的postgres查询非常慢

时间:2017-09-27 17:41:11

标签: postgresql

我有一个包含单个表(reddit_comments)的postgres数据库,其中包含自2007年以来的所有reddit注释。表中只有10列,但我只是尝试查询subreddit这是一个文本字段。我为subreddit构建了一个btree索引。

关于表格的说明:

1)大约1.5-2亿行。

2)表中没有更多的插入或删除。这是静态的。

3)还有2个索引(作者和月份)

关于硬件:

1)Intel 8核心处理器

2)128 GB的ram

3)存储在7200 SATA驱动器上

当我运行以下查询时:

EXPLAIN (ANALYZE, BUFFERS) select * from reddit_comments WHERE 
subreddit = 'boston' LIMIT 20000;

查询需要花费大量时间,我得到以下输出:

Limit  (cost=0.70..80375.57 rows=20000 width=320) (actual 
time=32.421..52218.645 rows=20000 loops=1)
   Buffers: shared hit=344 read=19532
   I/O Timings: read=52051.619
   ->  Index Scan using subr_idx on reddit_comments  
(cost=0.70..1487554.68 rows=370154 width=320) (actual 
time=32.419..52202.785 rows=20000 loops=1)
     Index Cond: (subreddit = 'boston'::text)
     Buffers: shared hit=344 read=19532
     I/O Timings: read=52051.619
 Planning time: 0.184 ms
 Execution time: 52228.975 ms

如果我没有设置限制= 20000,则需要花费数小时才能运行(约600,000个结果)

我试图从这里实施许多建议:

https://wiki.postgresql.org/wiki/SlowQueryQuestions

但似乎没有什么能加快这个过程。是否有我遗漏的东西可以提高性能,或者只是在我需要获取更多数据时查询这个数据库会很慢?

1 个答案:

答案 0 :(得分:0)

您想要的数据遍布整个磁盘,因此需要花费大量时间来阅读它。如果你将主要在subreddits上运作,你可以执行:

CLUSTER reddit_comments USING subr_idx

这将重新排序表中的数据,以便在您的问题中运行查询时,查询必须读取更少的页面。根据其他过滤条件运行查询可能需要更长时间,但是会以独占方式锁定表格,并且需要花费大量时间(ref)。