_bt_check_unique checks every row in table when doing update?? - Mailing list pgsql-bugs
From | Mats Lofkvist |
---|---|
Subject | _bt_check_unique checks every row in table when doing update?? |
Date | |
Msg-id | y2qwupv5idg.fsf@algonet.se Whole thread Raw |
Responses |
Re: _bt_check_unique checks every row in table when doing update??
|
List | pgsql-bugs |
Hi, I'm running 7.2.1 on a sparc/solaris box. I get performance problems when doing updates in one of my tables (inserts are faster), so I tried to run it with profiling enabled. With reservations for my non-existent knowledge of the code, the results do look like the bad performance is because of some bug. When doing ~1000 inserts into the testdata table, gprof says this about _bt_check_unique which looks reasonable: ----------------------------------------------- 0.00 0.01 1002/1002 _bt_doinsert [86] [264] 0.1 0.00 0.01 1002 _bt_check_unique [264] 0.00 0.01 1006/1006 _bt_isequal [271] 0.00 0.00 1002/67941 _bt_binsrch <cycle 1> [4417] 0.00 0.00 6/429 heap_fetch [331] 0.00 0.00 2/857310 ReleaseBuffer [50] ----------------------------------------------- But when doing ~1000 updates (i.e. setting val0 and val1 with a where on an existing key0/key1/key2 triplet), I get this which seems very strange to me: ----------------------------------------------- 0.10 6.43 1002/1002 _bt_doinsert [21] [22] 17.3 0.10 6.43 1002 _bt_check_unique [22] 0.40 3.21 505436/505436 _bt_isequal [26] 0.57 2.22 500509/1000450 heap_fetch [23] 0.00 0.01 4926/27777 _bt_getbuf [157] 0.00 0.00 4926/25330 _bt_relbuf [262] 0.00 0.00 1002/2213707 _bt_binsrch <cycle 1> [4425] 0.00 0.00 1001/1878622 ReleaseBuffer [41] ----------------------------------------------- The schema is as follows: mats=# \d testdata Table "testdata" Column | Type | Modifiers --------+-----------------------+----------- key0 | character varying(32) | not null key1 | character varying(32) | not null key2 | character varying(32) | not null val0 | character varying(64) | not null val1 | text | not null Indexes: testdataval0index Unique keys: testdataindex mats=# \d testdataindex Index "testdataindex" Column | Type --------+----------------------- key0 | character varying(32) key1 | character varying(32) key2 | character varying(32) unique btree mats=# \d testdataval0index Index "testdataval0index" Column | Type --------+----------------------- val0 | character varying(64) btree mats=# select count(*) from testdata; count -------- 435614 (1 row) Note that he number of calls to _bt_isequal is very close to the number of rows in the table plus the number of dead rows. Vacuum analyze and/or recreating the unique index makes no difference as far as I can tell. (The fact that _bt_check_unique is called at all when doing an update seems strange by itself, but shouldn't be a problem if it was just done as efficiently as when doing an insert.) _ Mats Lofkvist mal@algonet.se
pgsql-bugs by date: