cursor_tuple_fraction
是一个 配置参数,用于设置规划器对游标将检索的行所占比例的估计。
cursor_tuple_fraction
在 PostgreSQL 8.4 中添加。
默认
cursor_tuple_fraction
的默认值为:0.1
。
用法
如果查询由游标执行,这意味着查询结果的子集可能会被检索,PostgreSQL 会尝试优化查询计划。例如,如果返回整个数据集作为顺序扫描比索引扫描更有效率,但对于要检索的数据子集来说,索引扫描会更快,它会使用索引扫描。
cursor_tuple_fraction
决定了通过 FETCH
操作预期检索的查询结果百分比,并且如果可用,将选择更适合数据子集的计划。
按 PostgreSQL 版本详细信息
cursor_tuple_fraction (PostgreSQL 19)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 18)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 17)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 16)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 15)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 14)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 13)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 12)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 11)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 10)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.6)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.5)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
需要重启 |
false |
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.4)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.3)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.2)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.1)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 9.0)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
文档:cursor_tuple_fraction
cursor_tuple_fraction (PostgreSQL 8.4)
设置 |
0.1 |
单位 |
|
类别 |
查询调优 / 其他规划器选项 |
简短描述 |
设置规划器对游标将检索的行所占比例的估计。 |
扩展描述 |
|
上下文 |
user |
变量类型 |
实数 |
来源 |
默认 |
最小值 |
0 |
最大值 |
1 |
枚举值 |
|
启动值 |
0.1 |
重置值 |
0.1 |
源文件 |
|
源行 |
|
文档:cursor_tuple_fraction
变更历史
示例
cursor_tuple_fraction
的用法示例 - 首先,设置一个包含 10,000,000 行(已索引)随机数的简单表,并禁用自动清理
当 cursor_tuple_fraction
设置为 1
(最大值)并且 random_page_cost
设置为一个非常高的值时,会选择顺序扫描
postgres=# BEGIN;
BEGIN
postgres=*# SET random_page_cost TO 1000;
SET
postgres=*# SET cursor_tuple_fraction TO 1;
SET
postgres=*# EXPLAIN
DECLARE cur CURSOR FOR
SELECT * FROM cursor_test ORDER BY val;
QUERY PLAN
----------------------------------------------------------------------------
Sort (cost=40459807.82..40484763.90 rows=9982431 width=8)
Sort Key: val
-> Seq Scan on cursor_test (cost=0.00..188320.31 rows=9982431 width=8)
(3 rows)
但将其降低到 0.1
(默认值)会导致索引扫描
postgres=*# SET cursor_tuple_fraction TO 0.1;
SET
postgres=*# EXPLAIN
DECLARE cur CURSOR FOR
SELECT * FROM cursor_test ORDER BY val;
QUERY PLAN
--------------------------------------------------------------------------------------------
Index Only Scan using val_ix on cursor_test (cost=0.43..54989736.90 rows=9982431 width=8)
(1 row)
通过实际获取 10 行所需的时间,分别将 cursor_tuple_fraction
设置为 1
和 0.1
,可以演示这种差异
postgres=# BEGIN ;
BEGIN
Time: 0.261 ms
postgres=*# SET cursor_tuple_fraction TO 1;
SET
Time: 0.305 ms
postgres=*# DECLARE cur CURSOR FOR
SELECT * FROM cursor_test ORDER BY val;
DECLARE CURSOR
Time: 0.324 ms
postgres=*# FETCH 10 FROM cur;
val
------------------------
4.086947802406371e-08
2.2672169275317344e-07
3.811600721714825e-07
4.729380020940255e-07
5.001395353421145e-07
5.545030219433755e-07
5.911655163171048e-07
6.835541628280595e-07
7.550144764945088e-07
7.852209042980007e-07
(10 rows)
Time: 3699.970 ms (00:03.700)
postgres=*# SET cursor_tuple_fraction TO 0.1;
SET
Time: 0.295 ms
postgres=*# FETCH 10 FROM cur;
val
------------------------
1.0436382211764794e-06
1.0606182454520052e-06
1.3870003436888823e-06
1.4260912035712892e-06
1.5682459066912458e-06
1.7877217302064707e-06
1.8104408385788417e-06
1.9592999442874515e-06
1.974146760508333e-06
2.328882489743833e-06
(10 rows)
Time: 0.311 ms