Postgresql:如何在执行计划中计算索引扫描成本?

时间:2015-08-26 15:36:38

标签: postgresql indexing

当我阅读Postgres文档时,我很容易找到如何计算顺序扫描的成本,但是在使用索引时没有一个单词用于计算,而在我尝试使用时,我搜索的公式中没有。

有关我的设置的信息: 表:500 000行,3786个实际页面 一列(spz)的唯一索引:1374个实际页面 其他设置是默认设置: (CPU_OPERATOR_COST = 0.0025,cpu_tuple_cost = 0.01,cpu_index_tuple_cost = 0.005,random_page_cost = 4,seq_page_cost = 1)

我使用了两个查询:

  1. select * from cars where spz <= X_number_of_rows (Index Scan using carsspz on cars) cost:cost_q1
  2. select spz from cars where spz <= X_number_of_rows (Index Only Scan using carsspz on cars) cost:cost_q2
  3. 以下是我收到的费用

    Rows    cost_left cost_q1   cost_q2
    1       0,42      4,44      4,44
    2       0,42      8,44      4,44
    3       0,42      8,46      4,46
    4       0,42      8,47      4,48
    5       0,42      8,49      4,49
    6       0,42      8,51      4,51
    7       0,42      8,53      4,53
    8       0,42      8,54      4,55
    9       0,42      8,56      4,56
    10      0,42      8,58      4,58
    
    100     0,42      10,1      6,1
    200     0,42      12,8      7,8
    500     0,42      23,88     16,88
    1000    0,42      40,36     29,36
    
    10 000  0,42      366,77    287,77
    50 000  0,42      1768,84   1408,83
    100 000 0,42      3580,9    2826,9
    

    有人可以提供适合我在表格中显示的所有变体的计算公式。

1 个答案:

答案 0 :(得分:0)

公式(或算法)很长,我觉得我不能在这里重现它,因此,这将是仅链接的答案,对不起。

幸运的是,PG的源代码结构和文档都很好,因此您可以在此处阅读整个算法。

计划者居住在src/backend/optimizer中,并且开始于planner.c,但是让我们直接跳到costsize.c中索引扫描的成本估算。

我们看到费用取决于索引的类型,因此我们需要转到amcostestimate function of a btree index,称为btcostestimate

在这里,我们发现此函数根据索引统计信息对数字进行调整,但是主要成本来自genericcostestimate

您会看到,例如考虑了缓存效果,这说明了为什么在实验中看不到线性关系。