这是一个使用 SQLAlchemy 和 AWS RDS postgres 数据库的 FastAPI 项目。数据库上的等待 (AAS) 突然增加到 2 以上(对于 2 个 vCPU - t4g.small 实例),并且在检查 Performance Insights 时,我发现 sql 指令 MOVE ALL IN "query-cursor_1 对 CPU 造成很大负载“,平均延迟超过 200 秒。这种情况每天会发生几次,每次大约五分钟。在此期间,数据库连接不会增加,数据库负载的增加也不会超出正常范围。
我没有执行 MOVE ALL IN "query-cursor_1" 指令,并且我无法确定该指令来自何处。
我没有使用游标,所以我觉得这条指令的执行很奇怪。我对游标的使用没有清楚的了解,但我知道它们的使用会导致性能问题和表阻塞。然而,正如我上面提到的,我并没有直接执行任何与光标相关的指令。
我一直在更改一些索引以提高大数据查询性能,但我的数据库相对较小,有 30 个表,几个表中最多有 50 万行。
我没有找到有关 RDS postgres 数据库查询的参考资料,也没有找到与此相关的 SQLAlchemy 参考资料。
感谢您的帮助!
此声明是由您的应用程序或某些亚马逊应用程序引起的。它不是来自数据库本身。
MOVE ALL IN <cursor>
将光标移动到结果集的末尾。这有效地执行了光标后面的完整查询。如果该查询需要 200 秒才能完成,那么 MOVE ALL
。
还有一件额外的事情需要考虑:如果你定义了一个游标,PostgreSQL 将以不同的方式优化语句。 PostgreSQL 将优化获取前 10% 行的执行时间,而不是优化完整语句的总执行时间。这通常是正确的做法,但如果像
MOVE ALL
那样立即执行完整的查询,则并不理想。尝试将配置参数 cursor_tuple_fraction
从默认值 0.1 更改为 1.0。也许这会提高你的表现。