这里的代价变量可以按照任意尺度衡量。我们只关心它们的相对值,将它们以相同的因子缩放不会影响规划器的选择。默认情况下,这些代价变量是基于顺序页面获取的代价的,即seq_page_cost被设置为1.0并且其他代价变量都参考它来设置。不过你可以使用你喜欢的不同尺度,例如在一个特定机器上的真实执行时间。
seq_page_cost (floating point)
设置规划器对一系列顺序磁盘页面获取中的一次的代价估计。默认值是1.0。通过把表和索引放在一个特殊的表空间(要设置该表空间的同名参数)中可以覆盖这个值(见ALTER TABLESPACE)。
random_page_cost (floating point)
设置规划器对一次非顺序获取磁盘页面的代价估计。默认值是4.0。通过把表和索引放在一个特殊的表空间(要设置该表空间的同名参数)中可以覆盖这个值(见ALTER TABLESPACE)。减少这个值(相对于seq_page_cost)将导致系统更倾向于索引扫描;提高它将让索引扫描看起来相对更昂贵。你可以一起提高或降低两个值来改变磁盘 I/O 代价相对于 CPU 代价的重要性,后者由下列参数描述。对磁盘存储的随机访问通常比顺序访问要贵不止四倍。但是,由于对磁盘的大部分随机访问(例如被索引的读取)都被假定在高速缓冲中进行,所以使用了一个较低的默认值(4.0)。默认值可以被想成把随机访问建模为比顺序访问慢 40 倍,而期望 90% 的随机读取会被缓存。如果你相信 90% 的缓冲率对你的负载是一个不正确的假设,你可以增加 random_page_cost 来更好的反映随机存储读取的真正代价。相应地,如果你的数据可以完全放在高速缓存中(例如当数据库小于服务器总内存时),降低 random_page_cost 可能是合适的。为具有很低的随机读取代价的存储(例如固态驱动器)采用较低的 random_page_cost 值可能更好。提示尽管系统可以是你把random_page_cost设置得小于seq_page_cost,但是实际上没有意义。不过,如果数据库被整个缓存在 RAM 中,将它们设置为相等是有意义的,因为在那种情况中不按顺序访问页面是没有惩罚值的。同样,在一个高度缓存化的数据库中,你应该相对于 CPU 参数降低这两个值,因为获取一个已经在 RAM 中的页面的代价要远小于通常情况下的代价。
cpu_tuple_cost (floating point)
设置规划器对一次查询中处理每一行的代价估计。默认值是0.01。
cpu_index_tuple_cost (floating point)
设置规划器对一次索引扫描中处理每一个索引项的代价估计。默认值是0.005。
cpu_operator_cost (floating point)
设置规划器对于一次查询中处理每个操作符或函数的代价估计。默认值是0.0025。
parallel_setup_cost (floating point)
设置规划器对启动并行工作者进程的代价估计。默认是1000。
parallel_tuple_cost (floating point)
设置规划器对于从一个并行工作者进程传递一个元组给另一个进程的代价估计。默认是0.1。
min_parallel_table_scan_size (integer)
设置必须扫描的最小表格数据量,以便考虑并行扫描。对于并行顺序扫描,扫描的表格数据量始终等于表格的大小,但使用索引时,扫描的表格数据量通常会少一些。默认值是8兆字节(8MB)。
min_parallel_index_scan_size (integer)
设置必须扫描的索引数据的最小数量,以便考虑并行扫描。请注意,并行索引扫描通常不会触及整个索引;这是计划者认为实际上将被相关扫描触及的页数。默认值是512千字节(512kB)。
effective_cache_size (integer)
设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用。在设置这个参数时,你还应该考虑数据库的共享缓冲区以及将被用于数据库数据文件的内核磁盘缓冲区。另外,还要考虑预计在不同表上的并发查询数目,因为它们必须共享可用的空间。这个参数对数据库分配的共享内存尺寸没有影响,它也不会保留内核磁盘缓冲,它只用于估计的目的。系统也不会假设在查询之间数据会保留在磁盘缓冲中。默认值是4吉字节(4GB)。