Just to check if I was nuts or not, I made up a test case:

create table foo (f1 text);
create index fooi on foo(f1);

then

truncate foo;
copy foo from stdin;
0000999999
0000999998
0000999997
... one million rows ...
0000000002
0000000001
0000000000
\.

versus

truncate foo;
copy foo from stdin;
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
... one million rows ...
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
\.

The first of these should of course force a btree split on the first
page each time it splits, while the second will involve the
probabilistic moveright on each split.  But the files will be exactly
the same size.

[EMAIL PROTECTED] ~]$ time psql -f zdecr10 test
TRUNCATE TABLE

real    1m41.681s
user    0m1.424s
sys     0m0.957s
[EMAIL PROTECTED] ~]$ time psql -f zsame10 test
TRUNCATE TABLE

real    1m40.927s
user    0m1.409s
sys     0m0.896s
[EMAIL PROTECTED] ~]$

And it just happens that I had this server built with profiling enabled,
so I was able to look at the stats for each run, and I see that
_bt_compare is actually called slightly *fewer* times in the
all-identical-data case.

zdecr10:
                             2954536             _bt_moveright <cycle 3> [57]
                             20938485             _bt_binsrch <cycle 3> [48]
                0.05    0.18    6491/3006701     _bt_insertonpg <cycle 2> [16]
[33]     4.9   11.73    0.00 23899512         _bt_compare <cycle 3> [33]
                             21944768             FunctionCall2 <cycle 3> [24]

zsame10:
                             2935922             _bt_moveright <cycle 3> [62]
                             17156948             _bt_binsrch <cycle 3> [54]
                3.45   11.09  465429/3072793     _bt_insertonpg <cycle 2> [16]
[31]     5.0   11.56    0.00 20558299         _bt_compare <cycle 3> [31]
                             18622167             FunctionCall2 <cycle 3> [24]

So the theory does work, at least for small index entries.  Currently
repeating with wider ones ...

                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to