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

时间:2017-12-06 22:16:54

标签: sql postgresql amazon-web-services

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

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

2 个答案:

答案 0 :(得分:4)

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

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

具体来说,请看work_mem

  

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

只要您在一次操作或一组并行操作中耗尽工作内存,就可以了。

修改:以上是问题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

答案 1 :(得分:2)

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

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