Обсуждение: Padding on 64-bit
Hi! When running on a 64-bit server, are 32-bit ints padded to 64-bit? Specifically, I'm interested if I actually end up making my table any smaller if I move from 64-bit integer primary key to 32-bit. (Need to keep the index as small as possible to fit in cache) 64-bit on Debian linux running on Intel CPUs, if that make a difference. //Magnus
Magnus Hagander <magnus@hagander.net> writes:
> Specifically, I'm interested if I actually end up making my table any
> smaller if I move from 64-bit integer primary key to 32-bit.
Depends what else is in the row ... the overall row will get padded to
MAXALIGN, but if you were wasting 4 bytes on alignment before, then you
win.
regards, tom lane
Tom Lane wrote: > Magnus Hagander <magnus@hagander.net> writes: >> Specifically, I'm interested if I actually end up making my table any >> smaller if I move from 64-bit integer primary key to 32-bit. > > Depends what else is in the row ... the overall row will get padded to > MAXALIGN, but if you were wasting 4 bytes on alignment before, then you > win. Ah, I see. Followup: Does it make a measurable performance difference for things like join or filtering operations, in case the storage size ends up being the same? //Magnus
Magnus Hagander <magnus@hagander.net> writes:
>>> Specifically, I'm interested if I actually end up making my table any
>>> smaller if I move from 64-bit integer primary key to 32-bit.
>>
>> Depends what else is in the row ... the overall row will get padded to
>> MAXALIGN, but if you were wasting 4 bytes on alignment before, then you
>> win.
> Ah, I see. Followup: Does it make a measurable performance difference
> for things like join or filtering operations, in case the storage size
> ends up being the same?
Hard to say. int8 is pass-by-reference, which is certainly slower than
pass-by-value, but you'd have to measure to see if it makes any
noticeable difference in your queries.
(I imagine someday we'll get around to allowing int8 to be pass-by-value
on 64-bit platforms.)
regards, tom lane
On Tue, 2007-29-05 at 16:01 -0400, Tom Lane wrote: > (I imagine someday we'll get around to allowing int8 to be pass-by-value > on 64-bit platforms.) This could really be a significant performance win: I'm planning to take a look at doing it for 8.4. -Neil
Added to TODO: * Consider allowing 64-bit integers to be passed by reference on 64-bit platforms --------------------------------------------------------------------------- Neil Conway wrote: > On Tue, 2007-29-05 at 16:01 -0400, Tom Lane wrote: > > (I imagine someday we'll get around to allowing int8 to be pass-by-value > > on 64-bit platforms.) > > This could really be a significant performance win: I'm planning to take > a look at doing it for 8.4. > > -Neil > > > > ---------------------------(end of broadcast)--------------------------- > TIP 9: In versions below 8.0, the planner will ignore your desire to > choose an index scan if your joining column's datatypes do not > match -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
I think that's backwards. We *are* passing them by reference, we should be considering passing them by value. //Magnus Bruce Momjian wrote: > Added to TODO: > > * Consider allowing 64-bit integers to be passed by reference on 64-bit > platforms > > > --------------------------------------------------------------------------- > > Neil Conway wrote: >> On Tue, 2007-29-05 at 16:01 -0400, Tom Lane wrote: >>> (I imagine someday we'll get around to allowing int8 to be pass-by-value >>> on 64-bit platforms.) >> This could really be a significant performance win: I'm planning to take >> a look at doing it for 8.4. >> >> -Neil >> >> >> >> ---------------------------(end of broadcast)--------------------------- >> TIP 9: In versions below 8.0, the planner will ignore your desire to >> choose an index scan if your joining column's datatypes do not >> match >
Magnus Hagander wrote: > I think that's backwards. We *are* passing them by reference, we should > be considering passing them by value. Thanks, fixed. --------------------------------------------------------------------------- > > //Magnus > > > Bruce Momjian wrote: > > Added to TODO: > > > > * Consider allowing 64-bit integers to be passed by reference on 64-bit > > platforms > > > > > > --------------------------------------------------------------------------- > > > > Neil Conway wrote: > >> On Tue, 2007-29-05 at 16:01 -0400, Tom Lane wrote: > >>> (I imagine someday we'll get around to allowing int8 to be pass-by-value > >>> on 64-bit platforms.) > >> This could really be a significant performance win: I'm planning to take > >> a look at doing it for 8.4. > >> > >> -Neil > >> > >> > >> > >> ---------------------------(end of broadcast)--------------------------- > >> TIP 9: In versions below 8.0, the planner will ignore your desire to > >> choose an index scan if your joining column's datatypes do not > >> match > > -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Bruce Momjian <bruce@momjian.us> writes:
> Magnus Hagander wrote:
>> I think that's backwards. We *are* passing them by reference, we should
>> be considering passing them by value.
> Thanks, fixed.
Also, the TODO item ought to mention float4 and float8, which IMHO ought
to be changed at the same time. float4 could become pass-by-val-always.
I think the main reason we've avoided that is to avoid breaking old code
that is not using DatumGet/GetDatum macros, but we'll be breaking most
such code anyway with this set of changes.
regards, tom lane
Tom Lane wrote: > Bruce Momjian <bruce@momjian.us> writes: > > Magnus Hagander wrote: > >> I think that's backwards. We *are* passing them by reference, we should > >> be considering passing them by value. > > > Thanks, fixed. > > Also, the TODO item ought to mention float4 and float8, which IMHO ought > to be changed at the same time. float4 could become pass-by-val-always. > I think the main reason we've avoided that is to avoid breaking old code > that is not using DatumGet/GetDatum macros, but we'll be breaking most > such code anyway with this set of changes. Update: * Consider allowing 64-bit integers and floats to be passed by value on 64-bit platforms Also change 32-bit floats (float4) to be passed by value at the same time. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +