当SQL查询内存不足时会发生什么?

问题描述 投票:6回答:2

我想在AWS上设置一个Postgres服务器,最大的表将是10GB - 我必须为这个实例选择10GB的内存吗?

当我的查询结果大于10GB时会发生什么?

sql postgresql amazon-web-services
2个回答
4
投票

什么都不会发生,整个结果集都没有加载到内存中。将在准备结果时根据需要使用和重新使用最大可用内存,并根据需要将其溢出到磁盘。

有关详细信息,请参阅PostgreSQL resource documentation

具体来说,看看work_mem

work_mem(integer)指定在写入临时磁盘文件之前内部排序操作和哈希表要使用的内存量。

只要您没有在单个操作或一组并行操作上耗尽工作内存就可以了。

编辑:以上是What happens when you query a 10GB table without 10GB of memory on the server/instance?问题的答案

以下是更新后问题的更新答案:

  • 仅使用服务器端资源来生成结果集
  • 假设使用JDBC驱动程序,默认情况下,整个结果集将发送到本地计算机,这可能会导致内存不足错误

可以通过使用游标更改提取大小来更改此行为。

Reference to this behavior here

Getting results based on a cursor


2
投票

在服务器端,通过像你这样的简单查询,它只保留一个指向它所在位置的“光标”,因为它将结果假脱机,并且使用的内存非常少。现在如果那里有一些“排序”或者没有那些,它没有可以使用的索引,可能会占用大量内存,不确定那里。在客户端,postgres JDBC客户端默认将“整个结果”加载到内存中,然后再将它们传递给您(通过指定获取计数可以克服)。

使用更复杂的查询(例如,给我所有100M行,但按“X”排序,其中X未编入索引)我不知道,但可能在内部创建临时表(因此它不会耗尽RAM ),作为普通表处理,使用磁盘支持。如果有一个匹配的索引,那么它只能遍历它,使用一个指针仍然使用很少的RAM。

© www.soinside.com 2019 - 2024. All rights reserved.