On Fri, Sep 16, 2011 at 9:08 PM, Benjamin LaHaise <b...@kvack.org> wrote: > For such tables, can't Postgres track the size of the file internally? I'm > assuming it's keeping file descriptors open on the tables it manages, in > which case when it writes to a file to extend it, the internally stored size > could be updated. Not making a syscall at all would scale far better than > even a modified lseek() will perform.
There's no hardwired limit on how many tables you can have in a database, it's not limited by the number of file descriptors. Postgres would have to keep some kind of LRU for recently opened files and their sizes or something like that. There would probably still be a lot of lseeks/fstats going on. Generally keeping a Postgres cached value for the size would then have a reliability issue. It's much safer to have a single authoritative value -- the actual length of the file -- than have the same value stored in two locations and then need to worry about them getting out of sync. If a write fails when extending the file due to a filesystem running out of space then Postgres might not know how to update its internal cached state accurately for example. There's no question it could be done but it's not clear it would necessarily be much faster than a lock-free lseek/fstat. On Fri, Sep 16, 2011 at 6:27 PM, Andres Freund <and...@anarazel.de> wrote: > It depends on where the information is used. For some of the uses it needs to > be exact (the assumed size is rechecked after acquiring a lock preventing > extension) Fwiw this might give the wrong impression. I don't believe scans acquire a lock preventing extension -- that is another process can be concurrently extending the file at the same time as the scan is proceeding. The scan only locks out truncation (vacuum). Any blocks added by another process are ignored by the scan because they can only contain records invisible to that transaction. This does depend on the lseek/fstat being done after the transaction snapshot is taken which is possibly "rechecking" the value taken by the query planner but they're really two independent things. -- greg -- Sent via pgsql-hackers mailing list (email@example.com) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers