我有一个运行简单查询的RDS PostgreSQL实例,比我预期的要慢得多 - 特别是顺序扫描,比如复制表或计算表。
EG。 create table copied_table as (select * from original_table)
或select count(*) from some_table
在30GB的桌面上运行count(*)
需要大约15分钟(带有索引,紧接着一个真空)。
这是一个RDS db.r3.large,15 GB内存,400GB SSD。观察指标日志,我从未见过读取IOPS超过1,400,通常在500左右,远低于我的预期基数。
配置: work_mem:2GB, shared_buffers:3GB, effective_cache_size:8GB wal_buffers:16MB, checkpoint_segments:16
这是预期的时间吗?我应该看到更高的IOPS吗?
答案 0 :(得分:1)
除了在9.6中实现并行顺序扫描(在RDS中尚不可用)之外,你可以在Postgres中使用普通计数查询做很多事情。
事件虽然,您可以找到一些提示here。通常,建议尝试通过在投影中创建索引及其列来使Postgres使用仅索引扫描。
SELECT id FROM table WHERE id > 6 and id <100;
-- or
SELECT count(id) FROM table ...
表应该在该列上有一个索引。
您作为示例公开的查询不会避免顺序扫描。对于CREATE TABLE,如果您不关心表中的顺序,可以打开一些后端并通过按键范围过滤并行导入。此外,在RDS上加速此操作的唯一方法是增加IOP。