Postgresql的查询优化是基于代价的,代价是一个无量纲的值,不是绝对的性能指标,但可以作为比较各种操作代价时的相对性能代价。
其值是在postgresql.conf配置的,
# - Planner Cost Constants(计划器代价常量) -
#seq_page_cost = 1.0 # 顺序扫描一个数据块cost=1,任意比例被测量
random_page_cost = 4.0 # 随机扫描一个数据块cost=4,比例尺同上
#cpu_tuple_cost = 0.01 # 处理一个数据行的cpu,cost= 0.01比例尺同上
#cpu_index_tuple_cost = 0.005 # 处理一个索引行的cpu,cost = 0.005,比例尺同上
#cpu_operator_cost = 0.0025 # 每个操作符的cpu,cost = 0.0025,比例尺同上
#parallel_tuple_cost = 0.1 # 并行处理数据,cost = 0.1比例尺同上
#parallel_setup_cost = 1000.0 #启并行处理, cost = 1000, 比例尺同上
#min_parallel_table_scan_size = 8MB #启用并行查询的表的最小值
#min_parallel_index_scan_size = 512kB#启用并行索引扫描的最小值
可以看出,随机扫描的进度是顺序扫描进度的1/4,
Postgresql默认值是基于HDD(普通硬盘)设置的,
如果是SSD硬盘,random_page_cost 默认为4.0有点大,计划器可能会选择低效的计划,SSD时,最好将random_page_cost设置为1.0