On Tue, 23 Apr 2019 at 20:23, Peter Eisentraut <peter.eisentr...@2ndquadrant.com> wrote: > The attached patch is based on your sketch. It's clearly better in the > long term not to rely on heap tuples here. But in testing this change > seems to make it slightly slower, certainly not a speedup as you were > apparently hoping for. > > > Test setup: > > create table t0 (a int, b int); > insert into t0 select generate_series (1, 10000000); -- 10 million > \copy t0 (a) to 'test.dat'; > > -- for comparison, without generated column > truncate t0; > \copy t0 (a) from 'test.dat'; > > -- master > create table t1 (a int, b int generated always as (a * 2) stored); > truncate t1; > \copy t1 (a) from 'test.dat'; > > -- patched > truncate t1; > \copy t1 (a) from 'test.dat';
I didn't do the exact same test, but if I use COPY instead of \copy, then for me patched is faster. Normal table: postgres=# copy t0 (a) from '/home/drowley/test.dat'; COPY 10000000 Time: 5437.768 ms (00:05.438) postgres=# truncate t0; TRUNCATE TABLE Time: 20.775 ms postgres=# copy t0 (a) from '/home/drowley/test.dat'; COPY 10000000 Time: 5272.228 ms (00:05.272) Master: postgres=# copy t1 (a) from '/home/drowley/test.dat'; COPY 10000000 Time: 6570.031 ms (00:06.570) postgres=# truncate t1; TRUNCATE TABLE Time: 17.813 ms postgres=# copy t1 (a) from '/home/drowley/test.dat'; COPY 10000000 Time: 6486.253 ms (00:06.486) Patched: postgres=# copy t1 (a) from '/home/drowley/test.dat'; COPY 10000000 Time: 5359.338 ms (00:05.359) postgres=# truncate table t1; TRUNCATE TABLE Time: 25.551 ms postgres=# copy t1 (a) from '/home/drowley/test.dat'; COPY 10000000 Time: 5347.596 ms (00:05.348) For the patch, I wonder if you need this line: + memcpy(values, slot->tts_values, sizeof(*values) * natts); If you got rid of that and changed the datumCopy to use slot->tts_values[i] instead. Maybe it's also worth getting rid of the first memcpy for the null array and just assign the element in the else clause. It might also be cleaner to assign TupleDescAttr(tupdesc, i) to a variable instead of using the macro 3 times. It'd make that datumCopy line shorter too. -- David Rowley http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services