random_page_cost
是一个用于设置规划器对非顺序获取磁盘页面的成本估算的配置参数。
random_page_cost
在PostgreSQL 7.0 中添加。
默认值
random_page_cost
的默认值为:4.0
。
用法
random_page_cost
是一个全局 GUC,对所有数据库有效。但是,可以使用以下方法为单个表空间设置它:
ALTER TABLESPACE ... SET ( random_page_cost = ...)
如果不同的值更适合它们存储的介质。请注意,如果为表空间设置,则无法覆盖random_page_cost
。
变更历史
- PostgreSQL 7.0
- 添加 (提交 b1577a7c)
示例
对于一个任意大的表,如果 random_page_cost
设置为默认值 4
,PostgreSQL 会选择索引扫描
postgres=# CREATE TABLE foo (id INT NOT NULL PRIMARY KEY); CREATE TABLE postgres=# INSERT INTO foo values(generate_series(1,10000000)); INSERT 0 10000000 postgres=# SHOW random_page_cost; random_page_cost ------------------ 4 (1 row) postgres=# EXPLAIN SELECT * FROM foo WHERE id BETWEEN 1000000 and 2000000; QUERY PLAN ----------------------------------------------------------------------------------- Index Only Scan using foo_pkey on foo (cost=0.43..32073.10 rows=1035633 width=4) Index Cond: ((id >= 1000000) AND (id <= 2000000)) (2 rows)
但是,如果 random_page_cost
设置为(一个不可能的高)值,PostgreSQL 将确定顺序扫描效率更高(即使实际上可能并非如此)
postgres=# SET random_page_cost to 4000; SET postgres=# EXPLAIN SELECT * FROM foo WHERE id BETWEEN 1000000 and 2000000; QUERY PLAN -------------------------------------------------------------- Seq Scan on foo (cost=0.00..194248.72 rows=1035633 width=4) Filter: ((id >= 1000000) AND (id <= 2000000)) (2 rows)
参考文献
- PostgreSQL 文档: random_page_cost
有用链接
- 调整 random_page_cost 及索引相关性如何影响查询计划 - 2024 年 5 月 PgAnalyze 博客文章
另请参阅
seq_page_cost, cpu_tuple_cost, cpu_index_tuple_cost, cpu_operator_cost