On Sun, Nov 28, 2010 at 11:51 PM, Tom Lane <t...@sss.pgh.pa.us> wrote: > Robert Haas <robertmh...@gmail.com> writes: >> Yeah, very true. What's a bit frustrating about the whole thing is >> that we spend a lot of time pulling data into the caches that's >> basically static and never likely to change anywhere, ever. > > True. I wonder if we could do something like the relcache init file > for the catcaches.
Maybe. It's hard to know exactly what to pull in, though, nor is it clear to me how much it would really save. You've got to keep the thing up to date somehow, too. I finally got around to doing some testing of page-faults-versus-actually-memory-initialization, using the attached test program, compiled with warnings, but without optimization. Typical results on MacOS X: first run: 297299 second run: 99653 And on Fedora 12 (2.6.32.23-170.fc12.x86_64): first run: 509309 second run: 114721 I guess the word "run" is misleading (I wrote the program in 5 minutes); it's just zeroing the same chunk twice and measuring the times. The difference is presumably the page fault overhead, which implies that faulting is two-thirds of the overhead on MacOS X and three-quarters of the overhead on Linux. This makes me pretty pessimistic about the chances of a meaningful speedup here. >> Maybe we could speed things up a bit if we got rid of the pg_attribute >> entries for the system attributes (except OID). > > I used to have high hopes for that idea, but the column privileges > patch broke it permanently. http://archives.postgresql.org/pgsql-hackers/2010-07/msg00151.php -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/time.h> char bss[512*1024*1024]; void print_times(char *tag, struct timeval *before, struct timeval *after) { int result = (after->tv_sec - before->tv_sec) * 1000000 + ((int)after->tv_usec) - ((int)before->tv_usec); printf("%s: %d\n", tag, result); } int main(int argc, char **argv) { struct timeval t1; struct timeval t2; struct timeval t3; if (gettimeofday(&t1, NULL)) return 1; memset(bss, 0, sizeof bss); if (gettimeofday(&t2, NULL)) return 1; memset(bss, 0, sizeof bss); if (gettimeofday(&t3, NULL)) return 1; print_times("first run", &t1, &t2); print_times("second run", &t2, &t3); return 0; }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers