Re: HOT is applied

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: HOT is applied
Дата
Msg-id 18567.1190339702@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: HOT is applied  ("Heikki Linnakangas" <heikki@enterprisedb.com>)
Ответы Re: HOT is applied  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: HOT is applied  ("Pavan Deolasee" <pavan.deolasee@gmail.com>)
Re: HOT is applied  ("Heikki Linnakangas" <heikki@enterprisedb.com>)
Список pgsql-hackers
"Heikki Linnakangas" <heikki@enterprisedb.com> writes:
> Tom Lane wrote:
>> I'd still like to think about whether we
>> can be smarter about when to invoke pruning, but that's a small enough
>> issue that the patch can go in without it.

> Yeah. I'm doing some micro-benchmarking, and the attached test case is
> much slower with HOT. It's spending a lot of time trying to prune, only
> to find out that it can't.

Not sure if that's an appropriate description or not.  oprofile
(on a dual Xeon running Fedora 6) shows me this:

CPU: P4 / Xeon with 2 hyper-threads, speed 2792.99 MHz (estimated)
Counted GLOBAL_POWER_EVENTS events (time during which processor is not stopped)
with a unit mask of 0x01 (mandatory) count 100000
samples  %        symbol name
1070003  29.8708  LWLockAcquire
1015097  28.3380  LWLockRelease
283514    7.9147  heap_page_prune
252270    7.0425  AllocSetAlloc
148981    4.1590  HeapTupleSatisfiesMVCC
146442    4.0882  TransactionIdIsInProgress
92673     2.5871  AllocSetFree
84966     2.3720  HeapTupleSatisfiesVacuum
83097     2.3198  TransactionIdGetStatus
80737     2.2539  SimpleLruReadPage_ReadOnly
52803     1.4741  TransactionLogFetch
43406     1.2117  heapgetpage
42536     1.1875  HeapTupleHeaderGetCmin
34842     0.9727  TransactionIdIsCurrentTransactionId
27761     0.7750  TransactionIdDidAbort
24833     0.6933  MemoryContextAlloc
16446     0.4591  TransactionIdPrecedes
16089     0.4491  HeapTupleHeaderGetCmax
12919     0.3607  hash_search_with_hash_value
11857     0.3310  pfree
4964      0.1386  heap_page_prune_opt
3683      0.1028  hash_any
3215      0.0898  LWLockConditionalAcquire
3086      0.0862  PinBuffer
2573      0.0718  UnpinBuffer
2009      0.0561  ConditionalLockBufferForCleanup
1854      0.0518  ReadBuffer_common
934       0.0261  XLogInsert
784       0.0219  heapgettup_pagemode

so basically it's all about the locking.  Maybe the problem is that with
HOT we lock the buffer too often?  heap_page_prune_opt is designed to
not take the buffer lock unless there's a good probability of needing
to prune, but maybe that's not working as intended.

[ pokes at it a bit more... ]  Actually the disturbing part is that
pruning doesn't seem to be working at all: after the test finishes,
I see

regression=# vacuum verbose testtable;
INFO:  vacuuming "public.testtable"
INFO:  "testtable": removed 10000 row versions in 44 pages
INFO:  "testtable": found 10000 removable, 1 nonremovable row versions in 45 pages
DETAIL:  0 dead row versions cannot be removed yet.
There were 9955 unused item pointers.
45 pages contain useful free space.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
VACUUM

Shouldn't we be able to prune rows that have been inserted and deleted
by the same transaction?  I'd have hoped to see this example use only
one heap page ...
        regards, tom lane


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: curious regression failures
Следующее
От: ITAGAKI Takahiro
Дата:
Сообщение: ecpg PREPARE is not thread safe