我有一个包含单个表(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
但似乎没有什么能加快这个过程。是否有我遗漏的东西可以提高性能,或者只是在我需要获取更多数据时查询这个数据库会很慢?
答案 0 :(得分:0)
您想要的数据遍布整个磁盘,因此需要花费大量时间来阅读它。如果你将主要在subreddits上运作,你可以执行:
CLUSTER reddit_comments USING subr_idx
这将重新排序表中的数据,以便在您的问题中运行查询时,查询必须读取更少的页面。根据其他过滤条件运行查询可能需要更长时间,但是会以独占方式锁定表格,并且需要花费大量时间(ref)。