我想知道,当向postgres数据库发出查询时,是否可以设置它可能消耗的各种系统资源的上限。
例如,“X Query在执行过程中的任何一点都可以使用最多但不超过40%的CPU。”
类似于内存,持久存储IO等
我在此设想的用例是防止某些DB用户子集的某些恶意查询完全锁定机器/ db的资源与其他用户,无论是因为查询计划无效,还是数量所涉及的数据对于查询的某些参数有显着差异。
我猜这里有一个不可行/可行的原因,如果是这样的话,我会很感激为什么会有所了解。
答案 0 :(得分:3)
没有办法在PostgreSQL中为每个查询或每个用户设置资源使用的硬限制,但是,有一些东西可能有助于限制某些类型的资源使用。
有一些设置,temp_buffers和work_mem,它们对某些类型的内存使用设置了一些限制。从手册:
temp_buffers(整数)
设置每个数据库使用的最大临时缓冲区数 会话。这些是仅用于访问的会话本地缓冲区 临时表。默认值为8兆字节(8MB)。那个设定 可以在单个会话中更改,但仅在第一个会话之前更改 在会话中使用临时表;后来的尝试 更改该值对该会话没有影响。
会话将根据需要分配临时缓冲区,直至达到限制 由temp_buffers给出。在会话中设置较大值的成本 实际上并不需要很多临时缓冲区只是一个缓冲区 temp_buffers中每个增量的描述符或大约64个字节。然而 如果实际使用缓冲区,则将消耗额外的8192个字节 对于它(或通常,BLCKSZ字节)。
work_mem(整数)
指定内部排序操作要使用的内存量 和写入临时磁盘文件之前的哈希表。价值 默认为4兆字节(4MB)。请注意,对于复杂查询, 几个排序或散列操作可能并行运行;每 操作将被允许使用与此值一样多的内存 在开始将数据写入临时文件之前指定。也, 几个运行会话可以同时执行此类操作。 因此,使用的总内存可能是其值的许多倍 work_mem;选择时,有必要牢记这一事实 值。排序操作用于ORDER BY,DISTINCT和合并 连接。散列表用于散列连接,基于散列的聚合和 基于哈希的IN子查询处理。
您还可以通过更改用户角色来限制用户可以立即建立的连接数:
ALTER USER user_name WITH CONNECTION LIMIT 2;
这可能有助于限制用户可以同时运行的进程数。