Обсуждение: cost_index()

Поиск
Список
Период
Сортировка

cost_index()

От
Teodor Sigaev
Дата:
Hi!

Some fragment of code (src/backend/optimizer/path/costsize.c, lineno ~400):        /*         * Normal case: apply the
Mackertand Lohman formula, and then         * interpolate between that and the correlation-derived result.         */
    pages_fetched = index_pages_fetched(tuples_fetched,                                            baserel->pages,
                                     (double) index->pages,                                            root);        if
(indexonly)           pages_fetched = ceil(pages_fetched * (1.0 - baserel->allvisfrac));
 

As I understand the code, index_pages_fetched() returns summary of page's read 
for index and heap together. But on next line this recalculates with "all 
visible fraction" of heap. After recent vacuum it could be 1.0 and then 
pages_fetches will be zero. It seems to me obviously wrong, because it's for 
index only scan it could be true only for heap, not for index pages.

Am I wrong or miss something?



-- 
Teodor Sigaev                                   E-mail: teodor@sigaev.ru
  WWW: http://www.sigaev.ru/
 



Re: cost_index()

От
Tom Lane
Дата:
Teodor Sigaev <teodor@sigaev.ru> writes:
>          if (indexonly)
>              pages_fetched = ceil(pages_fetched * (1.0 - baserel->allvisfrac));

> As I understand the code, index_pages_fetched() returns summary of page's read 
> for index and heap together.

No.  Costs for touching the index were computed by the amcostestimate
function; this code is solely about estimating costs for touching the
heap.

> But on next line this recalculates with "all 
> visible fraction" of heap. After recent vacuum it could be 1.0 and then 
> pages_fetches will be zero. It seems to me obviously wrong, because it's for 
> index only scan it could be true only for heap, not for index pages.

Seems correct to me: if it's an index-only scan, and all pages are
all-visible, then indeed no heap pages will be fetched.

(Note that the cost model doesn't charge anything for touching the
visibility map.  This might be too simplistic, but certainly that cost
should be much smaller than touching the heap, since the map is small
enough that it should stay resident in shared buffers.)
        regards, tom lane



Re: cost_index()

От
Teodor Sigaev
Дата:
> No.  Costs for touching the index were computed by the amcostestimate
> function; this code is solely about estimating costs for touching the
> heap.
I see. Thank you.

-- 
Teodor Sigaev                                   E-mail: teodor@sigaev.ru
  WWW: http://www.sigaev.ru/