我在AWS RDS Postgres实例化视图上的简单查询返回缓慢(2-3分钟).我的工作假设是,这是一个网络传输问题,但我不是Postgres方面的专家.有关设置的一些背景知识:

  • "x86_64-PC-LINUX-GNU上的PostgreSQL 10.21,由x86_64-PC-LINUX-GNU-GCC(GCC)7.4.0编译,64位",
  • 在RDS、16个Aurora单元上以无服务器模式运行此程序
  • 这个过程是通过一个AWS VPN Connection
  • 该表大约有50M rows,30列,当前总大小为20 GB
  • 我已经在视图上放置了一个多列索引(2个感兴趣的列).其中一个具有~100K的唯一值,每个化合物大约1000行,另一个具有~500个唯一值,每个基因的范围为100K-2M行

当我 run 的时候:

SELECT * FROM my_materialized_view where "COMPOUND" = 'cpd1234';

该查询返回~3-5秒.

当我 run 的时候:

SELECT * FROM my_materialized_view where "GENE" = 'geneXYZ';

该查询需要大约2分钟才能返回1M行.返回的数据大小显示为100-200MB.

做一些稍微有些"异国情调"的事情:

SELECT * FROM my_materialized_view where "GENE" = 'geneXYZ' ORDER BY 'measured_value' LIMIT 10000; 

在大约12秒内返回数据.

我还跑了:

EXPLAIN ANALYZE SELECT * FROM my_materialized_view where "GENE" = 'geneXYZ';

输出似乎表明该过程大约为500ms

"对MY_MATERIALIZED_VIEW使用MY_MATERIALIZED_VIEW_IDX进行索引扫描(成本=0.56..1415484.25行=922393宽度=922393)(实际时间=437.332行=979434循环=1)" "索引条件:(""gene""=‘genXYZ’::Text)" "计划时间:0.092毫秒" "执行时间:491.306毫秒"

我是理解错了还是数据传输/网络延迟有问题?我使用pgadmin进行查询,但也通过pythonboto3运行查询,实现了相同的时间.感谢您对此的看法.谢谢!

推荐答案

关于您的情况的两个事实清楚地表明,您的数据传输速度确实很慢,而不是RDBMS服务器速度很慢.

  1. 您在第GENE列上有一个索引,而您的查询计划表明PostgreSQL正在使用它.
  2. 您的第二个查询有ORDER BY some_unindexed_column LIMIT some_number个,它用一个排序给PostgreSQL带来了负担.它返回大约1%的第一次查询的数据,并且完成速度快十倍.这意味着分类要花一些钱,但转移也要花一些钱.

Postgresql相关问答推荐

如何在PostgreSQL中正确删除数据库

对 VOLATILE 函数的调用会 destruct SELECT 语句的原子性

安装age-installation时出错

Postgres 生成的列不是不可变的

从单选插入到多个表

在 postgres 中Decode解码相似的函数

如何在可选参数上查询 postgres?

SQLAlchemy 和多个进程的连接问题

postgresql:致命:password authentication failed for user "douglas"

Rails 4 迁移: has_and_belongs_to_many table name

Postgres NOT IN (null) 没有结果

POSTGRESQL 中的 CHARINDEX (SQL SERVER) 相似函数是什么?

在 postgresql 中将 bool 转换为 int

如何使用 WITH RECURSIVE 子句进行 Select

将 Windows 上的 .sql 文件导入到 postgresql

PostgreSQL 嵌套 CTE 和 UNION

查询 JSON 列中的数组元素

postgresql中的移动平均线

如何在postgres中将整数分钟转换为间隔

Capistrano 与 PostgreSQL,错误:database is being accessed by other users