调整磁盘大小后 PostgreSQL 查询非常慢
PostgreSQL query is very slow after disk re-size
我正在为我的生产数据库使用 PostgreSQL DB,并且我最近调整了我的生产服务器磁盘卷的大小。
而且我注意到对特定 table(~10K 条记录)的查询非常慢,
EXPLAIN (analyze, buffers, timing) SELECT count(id) FROM markets_sales WHERE volume>0;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=1844791.17..1844791.18 rows=1 width=4) (actual time=79842.776..79842.777 rows=1 loops=1)
Buffers: shared hit=2329 read=1842313
-> Seq Scan on markets_sales (cost=0.00..1844782.68 rows=3399 width=4) (actual time=8139.929..79842.043 rows=6731 loops=1)
Filter: (volume > '0'::double precision)
Rows Removed by Filter: 4523
Buffers: shared hit=2329 read=1842313
Planning time: 0.110 ms
Execution time: 79842.809 ms
但是对另一个 table(~2K 条记录)的类似查询是完美的。
EXPLAIN ANALYZE SELECT count(id) FROM markets_volume WHERE percent>0;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Aggregate (cost=1368.87..1368.88 rows=1 width=4) (actual time=1.866..1.866 rows=1 loops=1)
-> Seq Scan on markets_volume (cost=0.00..1365.59 rows=1312 width=4) (actual time=0.023..1.751 rows=1313 loops=1)
Filter: (h24_change > '0'::double precision)
Rows Removed by Filter: 1614
Planning time: 0.093 ms
Execution time: 1.903 ms
(6 rows)
尝试使用PostgreSQL的慢查询日志。在默认配置中,慢速查询日志是不活动的。您应该从 postgresql.conf 文件中打开它。它为您提供了问题所在的更多详细信息。然后您可以针对该问题采取措施。
缓冲区的数量(=从磁盘读取的块)对于只有 11254 行来说太高了。
所以您的 table 很可能是 bloated。这可以使用以下方法纠正:
vacuum full analyze markets_sales;
请注意,该语句将需要 table 上的独占锁(从而阻止任何读取或写入访问)。
我正在为我的生产数据库使用 PostgreSQL DB,并且我最近调整了我的生产服务器磁盘卷的大小。
而且我注意到对特定 table(~10K 条记录)的查询非常慢,
EXPLAIN (analyze, buffers, timing) SELECT count(id) FROM markets_sales WHERE volume>0;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=1844791.17..1844791.18 rows=1 width=4) (actual time=79842.776..79842.777 rows=1 loops=1)
Buffers: shared hit=2329 read=1842313
-> Seq Scan on markets_sales (cost=0.00..1844782.68 rows=3399 width=4) (actual time=8139.929..79842.043 rows=6731 loops=1)
Filter: (volume > '0'::double precision)
Rows Removed by Filter: 4523
Buffers: shared hit=2329 read=1842313
Planning time: 0.110 ms
Execution time: 79842.809 ms
但是对另一个 table(~2K 条记录)的类似查询是完美的。
EXPLAIN ANALYZE SELECT count(id) FROM markets_volume WHERE percent>0;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Aggregate (cost=1368.87..1368.88 rows=1 width=4) (actual time=1.866..1.866 rows=1 loops=1)
-> Seq Scan on markets_volume (cost=0.00..1365.59 rows=1312 width=4) (actual time=0.023..1.751 rows=1313 loops=1)
Filter: (h24_change > '0'::double precision)
Rows Removed by Filter: 1614
Planning time: 0.093 ms
Execution time: 1.903 ms
(6 rows)
尝试使用PostgreSQL的慢查询日志。在默认配置中,慢速查询日志是不活动的。您应该从 postgresql.conf 文件中打开它。它为您提供了问题所在的更多详细信息。然后您可以针对该问题采取措施。
缓冲区的数量(=从磁盘读取的块)对于只有 11254 行来说太高了。
所以您的 table 很可能是 bloated。这可以使用以下方法纠正:
vacuum full analyze markets_sales;
请注意,该语句将需要 table 上的独占锁(从而阻止任何读取或写入访问)。