【单选题】在 KingbaseES V8 的参数中,设置用于构建临时 hash 表和临时物化操作的内存大小的参数是什么?

  • shared_buffers
  • work_mem
  • autovacuum_work_mem
  • temp_buffers

解题思路:

1、shared_buffers

原理:数据库服务器使用的共享内存缓冲区的数量,主要用于缓存数据,根据需求一般不能设置超过 80% 的内存,但至少是20%。比如 32g 内存测性能,一般可以设置 shared_buffers 22~25g。

应用范围:数据库本身,查询的数据量比较大,比较频繁使用到。

2、work_mem

原理:内部排序和哈希操作可使用的工作内存大小。该内存是在开始使用临时磁盘文件之前使用的内存数目。

应用范围:数据比较多大的情况,主要排序的数据有关系,排序数据越大,设置的就越大,比如 16g 内存,tpch 测试,单用户 10g 规模数据,设置 2g 的 work_mem。数值以 kB 为单位的,缺省是 1024(1MB),比如 tpcc1000warehouse,并发 50 个,设置 20mb 即可。

对于复杂的查询,可能会同时并发运行好几个排序或者哈希操作,每个都会使用这个参数声明的这么多内存,然后才会开始求助于临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是 work_mem 的好几倍。ORDER BY,DISTINCT 和 mergejoin都要用到排序操作,而哈希操作在哈希连接、哈希聚集和以哈希为基础的 IN 子查询处理中都会用到。

3、autovacuum_work_mem

指定每个自动清理工作者进程能使用的最大内存量。其默认值为 -1,表示转而使用 maintenance_work_mem 的值。当运行在其他上下文环境中时, 这个设置对 VACUUM 的行为没有影响。

4、temp_buffers

设置每个数据库会话使用的临时缓冲区的最大数目。这些都是会话的本地缓冲区,只用于访问临时表。默认是 8 兆字节(8MB)。这个设置可以在独立的会话内部被改变,但是只有在会话第一次使用临时表之前才能改变; 在会话中随后企图改变该值是无效的。

一个会话将按照temp_buffers给出的限制根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值, 其开销只是一个缓冲区描述符,或者说temp_buffers每增加一则增加大概 64 字节。不过,如果一个缓冲区被实际使用,那么它就会额外消耗 8192 字节(或者BLCKSZ字节)。