Thread: OID wraparound (was Re: pg_depend)
Bruce Momjian <pgman@candle.pha.pa.us> writes: > Yikes, I am not sure we are ready to make oids optional. We've discussed it enough, it's time to do it. I have an ulterior plan here: I want 7.2 not to have any limitations that prevent it from being used in a true 24x7, up-forever scenario. VACUUM lockouts are fixed now, or nearly. The other stumbling blocks for continuous runs are OID wraparound and XID wraparound. We've got unique indexes on OIDs for all system catalogs that need them (we were short a couple as of 7.1, btw), but OID wrap is still likely to lead to unwanted "duplicate key" failures. So we still need a way to reduce the system's appetite for OIDs. In a configuration where OIDs are used only where *necessary*, it'd be a long time till wrap. I also intend to do something about XID wrap next month... > Do we return unused oids back to the pool on backend exit yet? Since WAL, and that was never a fundamental answer anyway. > Will we have cheap 64-bit oids by the time oid wraparound becomes an > issue? No, we won't, because OID wrap is an issue already for any long-uptime installation. (64-bit XIDs are not a real practical answer either, btw.) regards, tom lane
On Wednesday 18 July 2001 13:52, Tom Lane wrote: > here: I want 7.2 not to have any limitations that prevent it from being > used in a true 24x7, up-forever scenario. VACUUM lockouts are fixed > now, or nearly. The other stumbling blocks for continuous runs are OID Go for it, Tom. After the posting the other day about the 200GB data per week data load, this _really_ needs to be done. It won't directly affect me, as my needs are a little more modest (just about anything looks modest compared to _that_ data load). Petty limitations such as these two need to go away, and soon -- we're getting used by big installations now. This isn't Stonebraker's research Postgres anymore. The 7.1 removal of previous limitations was nearly overdue -- and these two issues of ID wrap need to be addressed -- my gut feel is that the reports of OID/XID wrap are going to skyrocket within 6 months as bigger and bigger installations try out PostgreSQL/RHDB (fact is that many are going to try it out _because_ it has been relabeled by Red Hat....). The MySQL/NuSphere articles illustrate that -- the NuSphere guy goes as far as saying that the support of _Red_Hat_ is what gives PG credibilitiy -- and, you have to admit, RH's adoption of PG does increase, in many circles, PG's credibility. Of course, PG has credibility with me for other reasons -- it was, IMHO, just a matter of time before Red Hat saw the PostgreSQL Light..... -- Lamar Owen WGCR Internet Radio 1 Peter 4:11
Lamar Owen <lamar.owen@wgcr.org> writes: > ... these two issues of ID wrap need to be addressed -- my gut feel is > that the reports of OID/XID wrap are going to skyrocket within 6 months as > bigger and bigger installations try out PostgreSQL/RHDB Yes, my thoughts exactly. We're trying to play in the big leagues now. I don't believe we can put these problems off any longer. regards, tom lane
> Lamar Owen <lamar.owen@wgcr.org> writes: > > ... these two issues of ID wrap need to be addressed -- my gut feel is > > that the reports of OID/XID wrap are going to skyrocket within 6 months as > > bigger and bigger installations try out PostgreSQL/RHDB > > Yes, my thoughts exactly. We're trying to play in the big leagues now. > I don't believe we can put these problems off any longer. Is the idea to make oid's optional, with them disabled by default on user tables? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Yikes, I am not sure we are ready to make oids optional. > > We've discussed it enough, it's time to do it. I have an ulterior plan > here: I want 7.2 not to have any limitations that prevent it from being > used in a true 24x7, up-forever scenario. VACUUM lockouts are fixed > now, or nearly. The other stumbling blocks for continuous runs are OID > wraparound and XID wraparound. We've got unique indexes on OIDs for all > system catalogs that need them (we were short a couple as of 7.1, btw), > but OID wrap is still likely to lead to unwanted "duplicate key" > failures. So we still need a way to reduce the system's appetite for > OIDs. In a configuration where OIDs are used only where *necessary*, > it'd be a long time till wrap. I also intend to do something about XID > wrap next month... If you want to make oids optional on user tables, we can vote on that. However, OID's keep our system tables together. Though we don't need them on every system table, it seems they should be on all system tables just for completeness. Are we really losing a significant amount of oids through system tables? > > Do we return unused oids back to the pool on backend exit yet? > > Since WAL, and that was never a fundamental answer anyway. > > > Will we have cheap 64-bit oids by the time oid wraparound becomes an > > issue? > > No, we won't, because OID wrap is an issue already for any long-uptime > installation. (64-bit XIDs are not a real practical answer either, > btw.) Have we had a wraparound yet? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Lamar Owen <lamar.owen@wgcr.org> writes: > On Wednesday 18 July 2001 16:06, Tom Lane wrote: >> It remains to be debated exactly how users should control the choice for >> user tables, and which choice ought to be the default. I don't have a >> strong opinion about that either way, and am prepared to hear >> suggestions. > SET OIDGEN boolean for database-wide default policy. > CREATE TABLE WITH OIDS for individual tables? CREATE TABLE WITHOUT OIDS? Something along that line, probably. > ?? Is this sort of thing addressed by any SQL standard (Thomas?)? OIDs aren't standard, so the standards are hardly likely to help us decide how they should work. I think the really critical choice here is how much backwards compatibility we want to keep. The most backwards-compatible way, obviously, is OIDs on by default and things work exactly as they do now. But if we were willing to bend things a little then some interesting possibilities open up. One thing I've been wondering about is whether an explicit WITH OIDS spec ought to cause automatic creation of a unique index on OID for that table. ISTM that any application that wants OIDs at all would want such an index... regards, tom lane
If OIDs are dropped a mechanism for retrieving the primary key of the last insert would be greatly appreciated. Heck, it would be useful now (rather than returning OID). I much prefer retrieving the sequence number after the insert than before insert where the insert uses it. Especially when trigger muckary is involved. -- Rod Taylor Your eyes are weary from staring at the CRT. You feel sleepy. Notice how restful it is to watch the cursor blink. Close your eyes. The opinions stated above are yours. You cannot imagine why you ever felt otherwise. ----- Original Message ----- From: "Tom Lane" <tgl@sss.pgh.pa.us> To: "Lamar Owen" <lamar.owen@wgcr.org> Cc: "Bruce Momjian" <pgman@candle.pha.pa.us>; "PostgreSQL-development" <pgsql-hackers@postgresql.org> Sent: Wednesday, July 18, 2001 4:30 PM Subject: Re: OID wraparound (was Re: [HACKERS] pg_depend) > Lamar Owen <lamar.owen@wgcr.org> writes: > > On Wednesday 18 July 2001 16:06, Tom Lane wrote: > >> It remains to be debated exactly how users should control the choice for > >> user tables, and which choice ought to be the default. I don't have a > >> strong opinion about that either way, and am prepared to hear > >> suggestions. > > > SET OIDGEN boolean for database-wide default policy. > > CREATE TABLE WITH OIDS for individual tables? CREATE TABLE WITHOUT OIDS? > > Something along that line, probably. > > > ?? Is this sort of thing addressed by any SQL standard (Thomas?)? > > OIDs aren't standard, so the standards are hardly likely to help us > decide how they should work. > > I think the really critical choice here is how much backwards > compatibility we want to keep. The most backwards-compatible way, > obviously, is OIDs on by default and things work exactly as they > do now. But if we were willing to bend things a little then some > interesting possibilities open up. One thing I've been wondering > about is whether an explicit WITH OIDS spec ought to cause automatic > creation of a unique index on OID for that table. ISTM that any > application that wants OIDs at all would want such an index... > > regards, tom lane > > ---------------------------(end of broadcast)--------------------------- > TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org >
Bruce Momjian <pgman@candle.pha.pa.us> writes: > Is the idea to make oid's optional, with them disabled by default on > user tables? My thought is to make OID generation optional on a per-table basis, and disable it on system tables that don't need unique OIDs. (OID would read as NULL on any row for which an OID wasn't generated.) It remains to be debated exactly how users should control the choice for user tables, and which choice ought to be the default. I don't have a strong opinion about that either way, and am prepared to hear suggestions. regards, tom lane
On Wednesday 18 July 2001 16:06, Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Is the idea to make oid's optional, with them disabled by default on > > user tables? > It remains to be debated exactly how users should control the choice for > user tables, and which choice ought to be the default. I don't have a > strong opinion about that either way, and am prepared to hear > suggestions. SET OIDGEN boolean for database-wide default policy. CREATE TABLE WITH OIDS for individual tables? CREATE TABLE WITHOUT OIDS? ?? Is this sort of thing addressed by any SQL standard (Thomas?)? -- Lamar Owen WGCR Internet Radio 1 Peter 4:11
Also, without OID's, how do you fix EXACT duplicate records that happen by accident? LER >>>>>>>>>>>>>>>>>> Original Message <<<<<<<<<<<<<<<<<< On 7/18/01, 3:46:30 PM, Rod Taylor <rbt@barchord.com> wrote regarding Re: OID wraparound (was Re: [HACKERS] pg_depend) : > If OIDs are dropped a mechanism for retrieving the primary key of the > last insert would be greatly appreciated. Heck, it would be useful > now (rather than returning OID). > I much prefer retrieving the sequence number after the insert than > before insert where the insert uses it. Especially when trigger > muckary is involved. > -- > Rod Taylor > Your eyes are weary from staring at the CRT. You feel sleepy. Notice > how restful it is to watch the cursor blink. Close your eyes. The > opinions stated above are yours. You cannot imagine why you ever felt > otherwise. > ----- Original Message ----- > From: "Tom Lane" <tgl@sss.pgh.pa.us> > To: "Lamar Owen" <lamar.owen@wgcr.org> > Cc: "Bruce Momjian" <pgman@candle.pha.pa.us>; "PostgreSQL-development" > <pgsql-hackers@postgresql.org> > Sent: Wednesday, July 18, 2001 4:30 PM > Subject: Re: OID wraparound (was Re: [HACKERS] pg_depend) > > Lamar Owen <lamar.owen@wgcr.org> writes: > > > On Wednesday 18 July 2001 16:06, Tom Lane wrote: > > >> It remains to be debated exactly how users should control the > choice for > > >> user tables, and which choice ought to be the default. I don't > have a > > >> strong opinion about that either way, and am prepared to hear > > >> suggestions. > > > > > SET OIDGEN boolean for database-wide default policy. > > > CREATE TABLE WITH OIDS for individual tables? CREATE TABLE > WITHOUT OIDS? > > > > Something along that line, probably. > > > > > ?? Is this sort of thing addressed by any SQL standard (Thomas?)? > > > > OIDs aren't standard, so the standards are hardly likely to help us > > decide how they should work. > > > > I think the really critical choice here is how much backwards > > compatibility we want to keep. The most backwards-compatible way, > > obviously, is OIDs on by default and things work exactly as they > > do now. But if we were willing to bend things a little then some > > interesting possibilities open up. One thing I've been wondering > > about is whether an explicit WITH OIDS spec ought to cause automatic > > creation of a unique index on OID for that table. ISTM that any > > application that wants OIDs at all would want such an index... > > > > regards, tom lane > > > > ---------------------------(end of > broadcast)--------------------------- > > TIP 1: subscribe and unsubscribe commands go to > majordomo@postgresql.org > > > ---------------------------(end of broadcast)--------------------------- > TIP 3: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Is the idea to make oid's optional, with them disabled by default on > > user tables? > > My thought is to make OID generation optional on a per-table basis, and > disable it on system tables that don't need unique OIDs. (OID would > read as NULL on any row for which an OID wasn't generated.) > > It remains to be debated exactly how users should control the choice for > user tables, and which choice ought to be the default. I don't have a > strong opinion about that either way, and am prepared to hear > suggestions. I think it should be off on user tables by default, but kept on system tables just for completeness. It could be added at table creation time or from ALTER TABLEL ADD. It seems we just use them too much for system stuff. pg_description is just one example. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
> Also, without OID's, how do you fix EXACT duplicate records that happen > by accident? How about tid's? SELECT tid FROM tab1. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
> If OIDs are dropped a mechanism for retrieving the primary key of the > last insert would be greatly appreciated. Heck, it would be useful > now (rather than returning OID). > > I much prefer retrieving the sequence number after the insert than > before insert where the insert uses it. Especially when trigger > muckary is involved. Doesn't currval() work for your needs. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
> If you want to make oids optional on user tables, > we can vote on that. Let's vote. I'm proposing optional oids for 2-3 years, so you know how I'll vote -:) > However, OID's keep our system tables together. How?! If we want to find function with oid X we query pg_proc, if we want to find table with oid Y we query pg_class - we always use oids in context of "class" to what an object belongs. This means that two tuples from different system tables could have same oid values and everything would work perfectly. There is no magic around OIDs. Vadim
> > If you want to make oids optional on user tables, > > we can vote on that. > > Let's vote. I'm proposing optional oids for 2-3 years, > so you know how I'll vote -:) OK, we need to vote on whether Oid's are optional, and whether we can have them not created by default. > > > However, OID's keep our system tables together. > > How?! If we want to find function with oid X we query > pg_proc, if we want to find table with oid Y we query > pg_class - we always use oids in context of "class" > to what an object belongs. This means that two tuples > from different system tables could have same oid values > and everything would work perfectly. I meant we use them in many cases to link entries, and in pg_description for descriptions and lots of other things that may use them in the future for system table use. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Bruce Momjian <pgman@candle.pha.pa.us> writes: >> Also, without OID's, how do you fix EXACT duplicate records that happen >> by accident? > How about tid's? SELECT tid FROM tab1. "SELECT ctid", actually, but that is still the fallback. (Actually it always was --- OIDs aren't necessarily unique either, Larry.) regards, tom lane
> OK, we need to vote on whether Oid's are optional, > and whether we can have them not created by default. Optional OIDs: YES No OIDs by default: YES > > > However, OID's keep our system tables together. > > > > How?! If we want to find function with oid X we query > > pg_proc, if we want to find table with oid Y we query > > pg_class - we always use oids in context of "class" > > to what an object belongs. This means that two tuples > > from different system tables could have same oid values > > and everything would work perfectly. > > I meant we use them in many cases to link entries, and in > pg_description for descriptions and lots of other things > that may use them in the future for system table use. So, add class' ID (uniq id from pg_class) when linking. Vadim
Didn't know about that one, at least from the reading of the docs... Thanks, You answered the question. I knew OID's weren't unique, but they are likely to be able to distinguish between 2 rows in the same table. Maybe ctid needs to be documented better? LER >>>>>>>>>>>>>>>>>> Original Message <<<<<<<<<<<<<<<<<< On 7/18/01, 4:32:28 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote regarding Re: OID wraparound (was Re: [HACKERS] pg_depend) : > Bruce Momjian <pgman@candle.pha.pa.us> writes: > >> Also, without OID's, how do you fix EXACT duplicate records that happen > >> by accident? > > How about tid's? SELECT tid FROM tab1. > "SELECT ctid", actually, but that is still the fallback. (Actually > it always was --- OIDs aren't necessarily unique either, Larry.) > regards, tom lane
Larry Rosenman <ler@lerctr.org> writes: > Maybe ctid needs to be documented better? I think it's documented about as well as OID is, actually --- see http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/sql-syntax-columns.html which AFAIR is the only formal documentation of any of the system columns. regards, tom lane
[trimmed cc:list] On Wednesday 18 July 2001 17:09, Bruce Momjian wrote: > OK, we need to vote on whether Oid's are optional, and whether we can > have them not created by default. [All the below IMHO] OID's should be optional. System tables that absolutely have to have OIDs may keep them. No new OID usage, period. Use some other unique primary key. Default user tables to no OIDs. Document other means by which rows that are otherwise identical can be made unique, for the purpose of expunging duplicates (ctids or whatever is appropriate). Allow a SET DEFAULT CREATE OIDS style option for those who just _must_ have OIDS -- and integrate with GUC. Document that OID wrap can occur, and that it can cause Bad Things to happen. Allow a CREATE TABLE WITH OIDS to supplement the above option setting. Now for a question: OID creation seems to be a low-overhead task. Is the creation of SERIAL PRIMARY KEY values as efficient? Or will we be shooting ourselves in the performance foot if frequently-accessed system tables go from OID usage to SERIAL PRIMARY KEY usage? > I meant we use them in many cases to link entries, and in pg_description > for descriptions and lots of other things that may use them in the > future for system table use. If I may be so bold: we discourage users from using OIDs as a SERIAL PRIMARY KEY, yet the system does it en masse. I say all that knowing full well that I am using OIDs in my own applications.... :-) I guess I'll just need to switch to proper SERIALs and PRIMARY KEYs. Of course, if I wanted to be stubborn, I'd just use the GUC option to enable OIDs system-wide by default.... However, the utility of INSERT returning a unique identifier to the inserted row needs to be addressed -- I would prefer it return the defined PRIMARY KEY value for the tuple just inserted, if a PRIMARY KEY is defined. If no PRIMARY KEY is defined, return a unique identifier (even a temporary one like the ctid) so that I have that information for use later in the application. The utility of that feature should not be underestimated. Such a return value would of course have to be returned as a tuple with all the necessary metadata to process the return value -- this is probably not a trivial change. Of course, I may be missing some essential usage of OID's.... and I reserve the right to be wrong. -- Lamar Owen WGCR Internet Radio 1 Peter 4:11
Bruce Momjian <pgman@candle.pha.pa.us> writes: > I think it should be off on user tables by default, but kept on system > tables just for completeness. Clearly, certain system tables *must* have OIDs --- pg_class, pg_type, pg_operator, etc --- because we use those OIDs to refer to objects. These are exactly the same tables that have unique indexes on OID. However, I don't see the point of consuming OIDs for entries in, say, pg_listener. The notion that it must have OIDs simply because it's a system table seems silly. pg_attribute is on the edge --- are table columns objects in their own right, deserving of a separate OID, or not? So far I don't see any really good reason why they should have one. Since the goal is to minimize OID consumption, not assigning OIDs to pg_attribute entries seems like a good idea. I don't think this is just a marginal hack. ISTM the main source of OID consumption for an up-and-running system (if it has no large user tables with OIDs) will be creation of temp tables. We can expend two OIDs per temp table (pg_class and pg_type), or we can expend N+9 for an N-column temp table (the seven system attributes plus the N user ones plus pg_class and pg_type). That's *at least* a 5x difference in steady-state rate of OID consumption. If that doesn't get your attention, it should. regards, tom lane
>> I meant we use them in many cases to link entries, and in >> pg_description for descriptions and lots of other things >> that may use them in the future for system table use. pg_description is a point I hadn't thought about --- it uses OIDs to refer to pg_attribute entries. However, pg_description is pretty broken in its assumptions about OIDs anyway. I'm inclined to change it to be indexed by (object type ID, object OID, attributenumber) the same way that Philip proposed indexing pg_depend. Among other things, that'd make it much cheaper to drop comments during a DROP TABLE. You could just scan on (object type ID, object OID), and get both the table and all its columns in a single indexscan search, not one per column as happens now. regards, tom lane
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Remember most pg_description comments are not on column but on functions > > and stuff. That attributenumber is not going to apply there. > > Sure, it'd just be zero for non-column items. What do we do with other columns that need descriptions and don't have oid column. Make the attribute column mean something else? I just don't see a huge gain here and lots of confusion. User tables are a different story. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
currval() could work nicely, but thats an additional query. Currently OID (in php among others) can be retrieved along with the insert response which is instantly retrievable. This makes for a very quick middleware enforced foreign key entry in other databases. Returning the entire primary key of the last row inserted without doing additional queries -- this is a known element which could be cached -- could be very useful in these situations. With tables requiring multi-key elements we do a second select asking for currval()s of the sequences. -- Rod Taylor Your eyes are weary from staring at the CRT. You feel sleepy. Notice how restful it is to watch the cursor blink. Close your eyes. The opinions stated above are yours. You cannot imagine why you ever felt otherwise. ----- Original Message ----- From: "Bruce Momjian" <pgman@candle.pha.pa.us> To: "Rod Taylor" <rbt@barchord.com> Cc: "Lamar Owen" <lamar.owen@wgcr.org>; "Tom Lane" <tgl@sss.pgh.pa.us>; "PostgreSQL-development" <pgsql-hackers@postgresql.org> Sent: Wednesday, July 18, 2001 5:06 PM Subject: Re: OID wraparound (was Re: [HACKERS] pg_depend) > > If OIDs are dropped a mechanism for retrieving the primary key of the > > last insert would be greatly appreciated. Heck, it would be useful > > now (rather than returning OID). > > > > I much prefer retrieving the sequence number after the insert than > > before insert where the insert uses it. Especially when trigger > > muckary is involved. > > Doesn't currval() work for your needs. > > -- > Bruce Momjian | http://candle.pha.pa.us > pgman@candle.pha.pa.us | (610) 853-3000 > + If your life is a hard drive, | 830 Blythe Avenue > + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 >
On Wed, Jul 18, 2001 at 04:06:28PM -0400, Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Is the idea to make oid's optional, with them disabled by default on > > user tables? > > My thought is to make OID generation optional on a per-table basis, and > disable it on system tables that don't need unique OIDs. (OID would > read as NULL on any row for which an OID wasn't generated.) How about generalizing this to user defineable system attributes? OID would just be a special case: it's really just a system 'serial' isn't it? We occasionally get calls for other system type attributes that would be too expensive for every table, but would be useful for individual tables. One is creation_timestamp. Or this could be a route to bringing timetravel back in: start_date stop_date, anyone? > > It remains to be debated exactly how users should control the choice for > user tables, and which choice ought to be the default. I don't have a > strong opinion about that either way, and am prepared to hear > suggestions. Two ways come to mind: either special WITH options, at the end, or a new per attribute SYSTEM keyword: CREATE TABLE <...> WITH OIDS CREATE TABLE <...> WITH TIMETRAVEL CREATE TABLE <...> WITH DATESTAMP CREAT TABLE foo (oid oid SYSTEM, created timestamp SYSTEM DEFAULT CURRENT_TIMESTAMP, my_id serial, my_field text); So, basically it just creates the type and gives it a negative attnum. The 'oid system' case would need to be treated specially, hooking the oid up to the system wide counter. I'm not sure the special behavior of returning NULL for oid on a table without one is going to be useful: any client code that expects everything to have an oid is unlikely to handle NULL better than an error. In fact, in combination with the MS-Access compatability hack of '= NULL' as 'IS NULL', I see a potential great loss of data: SELECT oid,* from some_table; <display to user for editing> UPDATE some_table set field1=$field1, field2=$field2, <...> WHERE oid = $oid; if $oid is NULL ... There goes the entire table. Ross
Hiroshi Inoue <Inoue@tpf.co.jp> writes: > I don't love current OIDs. However they have lived in PostgreSQL's > world too long and few people have pointed out that there's no magic > around OIDs. I agree to change OIDs to be per class but strongly > object to let OIDs optional. Uh ... what? I don't follow what you are proposing here. regards, tom lane
Bruce Momjian <pgman@candle.pha.pa.us> writes: > Remember most pg_description comments are not on column but on functions > and stuff. That attributenumber is not going to apply there. Sure, it'd just be zero for non-column items. regards, tom lane
Lamar Owen <lamar.owen@wgcr.org> writes: > Now for a question: OID creation seems to be a low-overhead task. Is the > creation of SERIAL PRIMARY KEY values as efficient? Or will we be shooting > ourselves in the performance foot if frequently-accessed system tables go > from OID usage to SERIAL PRIMARY KEY usage? Yes, nowhere near, and yes. Sequence objects require disk I/O to update; the OID counter essentially lives in shared memory, and can be bumped for the price of a spinlock access. I don't think we should discourage use of OIDs quite as vigorously as you propose ;-). All I want is to not expend OIDs on things that have no need for one. That, together with clarifying exactly how unique OIDs should be expected to be, seems to me that it will solve 99% of the problem. regards, tom lane
> >> I meant we use them in many cases to link entries, and in > >> pg_description for descriptions and lots of other things > >> that may use them in the future for system table use. > > pg_description is a point I hadn't thought about --- it uses OIDs > to refer to pg_attribute entries. However, pg_description is pretty > broken in its assumptions about OIDs anyway. I'm inclined to change > it to be indexed by > > (object type ID, object OID, attributenumber) > > the same way that Philip proposed indexing pg_depend. Among other > things, that'd make it much cheaper to drop comments during a DROP > TABLE. You could just scan on (object type ID, object OID), and get > both the table and all its columns in a single indexscan search, > not one per column as happens now. Remember most pg_description comments are not on column but on functions and stuff. That attributenumber is not going to apply there. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Bruce Momjian wrote: > > > > If you want to make oids optional on user tables, > > > we can vote on that. > > > > Let's vote. I'm proposing optional oids for 2-3 years, > > so you know how I'll vote -:) > > OK, we need to vote on whether Oid's are optional, and whether we can > have them not created by default. > I don't love current OIDs. However they have lived in PostgreSQL's world too long and few people have pointed out that there's no magic around OIDs. I agree to change OIDs to be per class but strongly object to let OIDs optional. It's a big pain for generic applications to lose OIDs. In fact I'm implementing updatable cursors in ODBC using OIDs and Tids. regards, Hiroshi Inoue
"Ross J. Reedstrom" <reedstrm@rice.edu> writes: > On Wed, Jul 18, 2001 at 04:06:28PM -0400, Tom Lane wrote: >> My thought is to make OID generation optional on a per-table basis, and >> disable it on system tables that don't need unique OIDs. (OID would >> read as NULL on any row for which an OID wasn't generated.) > How about generalizing this to user defineable system attributes? OID > would just be a special case: it's really just a system 'serial' isn't it? Hmm. Of the existing system attributes, OID is the only one that's conceivably optional --- ctid,xmin,xmax,cmin,cmax are essential to the functioning of the system. (tableoid doesn't count here, since it's a "virtual" attribute that doesn't occupy any storage space on disk, and thus making it optional wouldn't buy anything.) So there's no gain to be seen in that direction. In the other direction, I have no desire to buy into adding creation timestamp or anything else in this go-round. Maybe sometime in the future. BTW, I'm not intending to change the on-disk format of tuple headers; if no OID is assigned to a row, the OID field will still be there, it'll just be 0. Given that it's only four bytes, it's probably not worth dealing with a variable header format to suppress the space usage. (On machines where MAXALIGN is 8 bytes, there likely wouldn't be any savings anyway.) I wouldn't much care for dealing with a variable tuple header format to support creation timestamp either, and that leads to the conclusion that it's just going to be a user field anyway. People who need it can do it with a trigger ... > I'm not sure the special behavior of returning NULL for oid on a table > without one is going to be useful: any client code that expects everything > to have an oid is unlikely to handle NULL better than an error. Well, I can see three possible choices: return NULL, return zero, or don't create an OID entry in pg_attribute at all for such a table (I *think* that would be sufficient to prevent people from accessing the OID column, but am not sure). Of these I'd think the first is least likely to break stuff. However, you might be right that breaking stuff is preferable to the possibility of an app that thinks it knows what it's doing causing major data lossage because it doesn't. regards, tom lane
Tom Lane wrote: > > Hiroshi Inoue <Inoue@tpf.co.jp> writes: > > I don't love current OIDs. However they have lived in PostgreSQL's > > world too long and few people have pointed out that there's no magic > > around OIDs. I agree to change OIDs to be per class but strongly > > object to let OIDs optional. > > Uh ... what? I don't follow what you are proposing here. > I couldn't think of the cases that we need database-wide uniqueness. So the uniqueness of OIDs could be only within a table. But I object to the option that tables could have no OIDs. regards, Hiroshi Inoue
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > > What do we do with other columns that need descriptions and don't have > > oid column. > > Like what? Depends what other system tables you are intending to remove oid's for? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Bruce Momjian <pgman@candle.pha.pa.us> writes: > What do we do with other columns that need descriptions and don't have > oid column. Like what? regards, tom lane
Bruce Momjian <pgman@candle.pha.pa.us> writes: > What do we do with other columns that need descriptions and don't have > oid column. >> >> Like what? > Depends what other system tables you are intending to remove oid's for? Nothing that requires a description ;-) regards, tom lane
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > > What do we do with other columns that need descriptions and don't have > > oid column. > >> > >> Like what? > > > Depends what other system tables you are intending to remove oid's for? > > Nothing that requires a description ;-) You are a sly one. :-) -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
From: Tom Lane <tgl@sss.pgh.pa.us> Subject: OID wraparound (was Re: [HACKERS] pg_depend) Date: Wed, 18 Jul 2001 13:52:45 -0400 Message-ID: <6335.995478765@sss.pgh.pa.us> > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > Yikes, I am not sure we are ready to make oids optional. > > We've discussed it enough, it's time to do it. I have an ulterior plan > here: I want 7.2 not to have any limitations that prevent it from being > used in a true 24x7, up-forever scenario. VACUUM lockouts are fixed > now, or nearly. What about pg_log? It will easily become a huge file. Currently the only solution is re-installing whole database, that is apparently unacceptable for very big installation like 1TB. > The other stumbling blocks for continuous runs are OID > wraparound and XID wraparound. We've got unique indexes on OIDs for all > system catalogs that need them (we were short a couple as of 7.1, btw), > but OID wrap is still likely to lead to unwanted "duplicate key" > failures. So we still need a way to reduce the system's appetite for > OIDs. In a configuration where OIDs are used only where *necessary*, > it'd be a long time till wrap. I also intend to do something about XID > wrap next month... So are we going to remove OID? I see following in the SQL99 draft (not sure it actually becomes a part of the SQL99 standard, though). Can we implement the "Object identifier" without the current oid mechanism? --------------------------------------------------------------------- 4.10 Object identifier An object identifier OID is a value generated when an object is created, to give that object an immutableidentity. It is unique in the known universe of objects that are instances of abstract data types,and is conceptually separate from the value, or state, of the instance. The object identifier type is described by an object identifier type descriptor. An object identifier typedescriptor contains: - an indication that this is an object identifier type; and - the name of the abstract data type within which the object identifier type is used. The object identifier type is only used to define the OID pseudo- column implicitly defined in object ADTswithin an ADT definition. ___________________________________________________________________ An OID literal exists for an object identifier type only if the associated abstract data type was definedWITH OID VISIBLE. The OID value is materialized as a character string with an implementation- definedlength and character set SQL_TEXT. --------------------------------------------------------------------- >> Will we have cheap 64-bit oids by the time oid wraparound becomes an >> issue? > >No, we won't, because OID wrap is an issue already for any long-uptime >installation. (64-bit XIDs are not a real practical answer either, >btw.) What's wrong with 64-bit oids (except extra 4bytes)? -- Tatsuo Ishii
Tatsuo Ishii <t-ishii@sra.co.jp> writes: > What about pg_log? It will easily become a huge file. Currently the > only solution is re-installing whole database, that is apparently > unacceptable for very big installation like 1TB. That's part of the XID wraparound issue, which is a separate discussion... but yes, I want to do something about that for 7.2 also. > So are we going to remove OID? No, only make it optional for user tables. > I see following in the SQL99 draft (not > sure it actually becomes a part of the SQL99 standard, though). Can we > implement the "Object identifier" without the current oid mechanism? As near as I can tell, SQL99's idea of OIDs has little to do with ours anyway. Note that they want to assign an OID to an "instance of an abstract data type". Thus, if you created a table with several columns each of which is one or another kind of ADT, then each column value would contain an associated OID --- the OID is assigned to each value, not to table rows. My suspicion is that SQL99-style OIDs would be implemented as a separate counter, and would be 8 bytes from the get-go. > What's wrong with 64-bit oids (except extra 4bytes)? Portability, mostly. I'm not ready to tell platforms without 'long long' that we don't support them at all anymore. If they don't have int8, or someday they don't have SQL99 OIDs, that's one thing, but zero functionality is something else. I'm also somewhat concerned about the speed price of widening Datum to 8 bytes on machines where that's not a well-supported datatype --- note that we'll pay for that almost everywhere, not only in Oid manipulations. regards, tom lane
>> What's wrong with 64-bit oids (except extra 4bytes)? > Portability, mostly. Oh, there's one other small problem: breaking the on-the-wire protocol. We send OIDs as column datatype identifiers, so an 8-byte-OID backend would not interoperate with clients that didn't also think OID is 8 bytes. Aside from client/server compatibility issues, that raises the portability ante a good deal --- not only your server machine has to have 'long long' support, but so do all your application environments. regards, tom lane
At 06:10 PM 18-07-2001 -0400, Lamar Owen wrote: >applications.... :-) I guess I'll just need to switch to proper SERIALs and >PRIMARY KEYs. Of course, if I wanted to be stubborn, I'd just use the GUC >option to enable OIDs system-wide by default.... The default 32 bit serial primary key isn't immune to roll overs either. I doubt it'll affect my stuff, but it'll affect others. Once you talk about storing petabytes or terabytes of data, 32 bits might not be enough. Cheerio, Link.
I wrote: > > Tom Lane wrote: > > > > Hiroshi Inoue <Inoue@tpf.co.jp> writes: > > > I don't love current OIDs. However they have lived in PostgreSQL's > > > world too long and few people have pointed out that there's no magic > > > around OIDs. I agree to change OIDs to be per class but strongly > > > object to let OIDs optional. > > > > Uh ... what? I don't follow what you are proposing here. > > > > I couldn't think of the cases that we need database-wide > uniqueness. So the uniqueness of OIDs could be only within > a table. But I object to the option that tables could have > no OIDs. > It seems that I'm the only one who objects to optional OIDs as usual:-). IMHO OIDs are not for system but for users. OIDs have lived in PostgreSQL world from the first(???). Isn't it sufficiently long for users to believe that OIDs are unique (at least per table) ? As I mentioned already I'm implementing updatable cursors in ODBC and have half done it. If OIDs would be optional my trial loses its validity but I would never try another implementation. regards, Hiroshi Inoue
On Thursday 19 July 2001 06:08, you wrote: > > Bruce Momjian <pgman@candle.pha.pa.us> writes: > I think it should be off on user tables by default, but kept on system > tables just for completeness. It could be added at table creation time > or from ALTER TABLEL ADD. It seems we just use them too much for system > stuff. pg_description is just one example. and what difference should it make, to have a few extra hundred or thousand OIDs used by system tables, when I insert daily some ten thousand records each using an OID for itself? Why not make OIDs 64 bit? Might slow down a little on legacy hardware, but in a couple of years we'll all run 64 bit hardware anyway. I believe that just using 64 bit would require the least changes to Postgres. Now, why would that look that obvious to me and yet I saw no mentioing of this in the recent postings. Surely it has been discussed before, so which is the point I miss or don't understand? I would need 64 bit sequences anyway, as it is predictable that our table for pathology results will run out of unique IDs in a couple of years. Horst
Lamar Owen <lamar.owen@wgcr.org> writes: > However, the utility of INSERT returning a unique identifier to the > inserted row needs to be addressed -- I would prefer it return the > defined PRIMARY KEY value for the tuple just inserted, if a PRIMARY > KEY is defined. If no PRIMARY KEY is defined, return a unique > identifier (even a temporary one like the ctid) so that I have that > information for use later in the application. The utility of that > feature should not be underestimated. That's something that needs to be thought about, all right. I kinda like the idea of returning the ctid, because it is (a) very low overhead, which is nice for something that the client may not actually need, and (b) the tuple can be retrieved *very* quickly given a tid, much more so than was possible with OID. OTOH, if you want to use a tid you'd best use it right away, before someone else can update the row... The major problem with any change away from returning OID is that it'll break client libraries and apps. How much pain do we want to cause ourselves in that line? Certainly, to return anything besides/instead of OID we'd have to change the FE/BE protocol. IIRC, there are a number of other things pending that require protocol changes, so gathering them all together and updating the protocol isn't necessarily a bad thing. But I don't think we have time for it in the 7.2 cycle, unless we slip the schedule past the beta-by-end-of-August that I believe we're shooting for. Another possibility, given that any app using a feature like this is nonportable anyway, is to extend the INSERT statement along the lines that someone (maybe Larry R? I forget now) proposed before: INSERT INTO foo ... RETURNING x,y,z,... where x,y,z, etc are expressions in the variables of the inserted tuple(s). This could be made to look like a SELECT at the protocol level, which would mean that it wouldn't break client libraries or require a protocol bump, and it's *way* more flexible than any hardwired decision about what columns to return. It wouldn't have any problem with multiple tuples inserted by an INSERT ... SELECT, either. regards, tom lane
Hiroshi Inoue <Inoue@tpf.co.jp> writes: > As I mentioned already I'm implementing updatable cursors > in ODBC and have half done it. If OIDs would be optional > my trial loses its validity but I would never try another > implementation. Could you use CTID instead of OID? regards, tom lane
On Thursday 19 July 2001 12:00 am, Tom Lane wrote: > Lamar Owen <lamar.owen@wgcr.org> writes: > > However, the utility of INSERT returning a unique identifier to the > > inserted row needs to be addressed -- I would prefer it return the > Another possibility, given that any app using a feature like this is > nonportable anyway, is to extend the INSERT statement along the lines > that someone (maybe Larry R? I forget now) proposed before: > INSERT INTO foo ... RETURNING x,y,z,... > where x,y,z, etc are expressions in the variables of the inserted I like this one. -- Lamar Owen WGCR Internet Radio 1 Peter 4:11
On Wednesday 18 July 2001 07:49 pm, Tom Lane wrote: > I don't think we should discourage use of OIDs quite as vigorously > as you propose ;-). Just playing devil's advocate. As I said, I am one who is using OID's in a client now.... but who is willing to forgo that feature for large-system stability. > All I want is to not expend OIDs on things that > have no need for one. That, together with clarifying exactly how > unique OIDs should be expected to be, seems to me that it will solve > 99% of the problem. 99% solved for 1% effort... The other 1% would take alot more effort. I think you're barking up the right tree, as usual, Tom. -- Lamar Owen WGCR Internet Radio 1 Peter 4:11
Tom Lane wrote: >Lamar Owen <lamar.owen@wgcr.org> writes:>>><snip>>>>><snip>>>Another possibility, given that any app using a feature likethis is>nonportable anyway, is to extend the INSERT statement along the lines>that someone (maybe Larry R? I forgetnow) proposed before:>> INSERT INTO foo ... RETURNING x,y,z,...>>where x,y,z, etc are expressions in the variablesof the inserted>tuple(s). This could be made to look like a SELECT at the protocol>level, which would mean thatit wouldn't break client libraries or>require a protocol bump, and it's *way* more flexible than any>hardwired decisionabout what columns to return. It wouldn't have>any problem with multiple tuples inserted by an INSERT ... SELECT,>either.> This would be a good thing (tm). I use Oracle quite extensively as well as PG and Oracle's method of "RETURNING :avalue" is very good for returning values from newly inserted rows. There was some talk a while back about [not?] implementing variable binding. This seems to become very closely related to that. It would seem to solve the problem of having a unique identifier returned for inserts. I'm sure it would please quite a few people in the process, especially ones moving across from Oracle. (kill two birds with one stone) >> regards, tom lane> Ashley Cambrell
At 00:00 19/07/01 -0400, Tom Lane wrote: >that someone (maybe Larry R? I forget now) proposed before: > > INSERT INTO foo ... RETURNING x,y,z,... > That would have been me; at the time we also talked about UPDATE...RETURNING and Jan proposed allowing UPDATE...RETURNING {[Old.|New.]Attr,...} Needless to say, I'd love to see it implemented. ---------------------------------------------------------------- Philip Warner | __---_____ Albatross Consulting Pty. Ltd. |----/ - \ (A.B.N. 75 008 659 498) | /(@) ______---_ Tel: (+61) 0500 83 82 81 | _________ \ Fax: (+61) 0500 83 82 82 | ___________ | Http://www.rhyme.com.au | / \| | --________-- PGP key available upon request, | / and from pgp5.ai.mit.edu:11371 |/
Tom Lane wrote: > > Hiroshi Inoue <Inoue@tpf.co.jp> writes: > > As I mentioned already I'm implementing updatable cursors > > in ODBC and have half done it. If OIDs would be optional > > my trial loses its validity but I would never try another > > implementation. > > Could you use CTID instead of OID? > I am using both. TIDs for fast access and OIDs for identification. Unfortunately TIDs are transient and they aren't that reliable as for identification. But the transience of TIDs are useful for row-versioning fortunately. The combination of OID and TID has been my plan since I introduced Tid scan. regards, Hiroshi Inoue
>>>Bruce Momjian said: [...]> > No, we won't, because OID wrap is an issue already for any long-uptime> > installation. (64-bit XIDs are not areal practical answer either,> > btw.)> > Have we had a wraparound yet? Just for the record, I had an OID overflow on production database (most middleware crashed mysteriously but no severe dataloss) about a month ago. This was on 7.0.2 which probably had some bug ... preventing real wrap to happen. No new allocations(INSERTs that used autoincrementing sequences) were possible in most tables. Anyway, I had to dump/restore the database - several hours downtime. The database is not very big in size (around 10 GB inthe data directory), but contains many objects (logs) and many objects are inserted/deleted from the database - in my opinionat not very high rate. Many tables are also created/dropped during processing. What is worrying is that this database lived about half a year only... In my opinion, making OIDs optional would help things very much. In my case, I don't need OIDs for log databases. Perhapsit would additionally help if OIDs are separately increasing for each database - not single counter for the entirePostgreSQL installation. Regards, Daniel
Hiroshi Inoue <Inoue@tpf.co.jp> writes: > Tom Lane wrote: >> Could you use CTID instead of OID? > I am using both. > TIDs for fast access and OIDs for identification. > Unfortunately TIDs are transient and they aren't > that reliable as for identification. Hmm ... within a transaction I think they'd be reliable enough, but for long-term ID I agree they're not. What behavior do you need exactly; do you need to be able to find the updated version of a row you originally inserted? What would it take to use a user-defined primary key instead of OID? regards, tom lane
J-P wrote: > > I need to create a new system table like pg_log to > > implement a replication scheme. The big problem is > how > > I could get an OID for it, a unique OID that is > > reserved for that table??? Hiroshi Inoue wrote: > > > Do you need the following ? > > visco=# select oid from pg_class where relname = > 'pg_log'; > oid > ------ > 1269 > (1 row) > > I'm afraid of misunderstanding. Sorry my question was wrongly asked. What I need is a unique OID for my new system table that is reserved for that table? A new Id that is not used by anything else, and that will never be used. (The reference to pg_log was just to show the similarity of what I need). N.B. I can't just #select oid from pg_class and take one that is not there, since I don't know if the oid I choose will be used by something else in the system?? Thanks for your help, J-P _______________________________________________________ Do You Yahoo!? Get your free @yahoo.ca address at http://mail.yahoo.ca
> Yes, nowhere near, and yes. Sequence objects require disk I/O to > update; the OID counter essentially lives in shared memory, and can > be bumped for the price of a spinlock access. Sequences also cache values (32 afair) - ie one log record is required for 32 nextval-s. Sequence' data file is updated at checkpoint time, so - not so much IO. I really think that using sequences for system tables IDs would be good. Vadim
Philip Warner <pjw@rhyme.com.au> writes: > At 00:00 19/07/01 -0400, Tom Lane wrote: >> INSERT INTO foo ... RETURNING x,y,z,... > That would have been me; at the time we also talked about > UPDATE...RETURNING and Jan proposed allowing UPDATE...RETURNING > {[Old.|New.]Attr,...} Hm. I'm less excited about UPDATE ... RETURNING since it would seem that SELECT FOR UPDATE followed by UPDATE would get that job done in a somewhat-less-nonstandard manner. But anyway --- Thinking about this some more, it seems that it's straightforward enough for a plain INSERT, but I don't understand what's supposed to happen if the INSERT is replaced by an ON INSERT DO INSTEAD rule. The rule might not contain an INSERT at all, or it might contain several INSERTs into various tables with no simple relationship to the original. What then? regards, tom lane
Tom Lane wrote: > > Hiroshi Inoue <Inoue@tpf.co.jp> writes: > > Tom Lane wrote: > >> Could you use CTID instead of OID? > > > I am using both. > > TIDs for fast access and OIDs for identification. > > Unfortunately TIDs are transient and they aren't > > that reliable as for identification. > > Hmm ... within a transaction I think they'd be reliable enough, > but for long-term ID I agree they're not. What behavior do you > need exactly;do you need to be able to find the updated version > of a row you originally inserted? What I was about to do in the case e.g. UPDATE is the following. 1) UPDATE .. set .. where CTID = saved_ctid and OID = saved_oid; If one row was updated it's OK and return. 2) Otherwise something has changed and the update operation would fail. However the driver has to try to find the updated version of the row in case of keyset-driven cursors by the query SELECT CTID, .. from .. where CTID = currtid2(table_name,saved_ctid) and OID = saved_oid; If a row was found, the content of cursors' buffer is replaced andreturn. 3) If no row was found, the row may be deleted. Or we could issue another query SELECT CTID, .. from .. where OID = saved_oid; though the performance is doubtful. The OIDs are (mainly) to prevent updating the wrong records. > What would it take to use a > user-defined primary key instead of OID? Yes it could be. In fact M$ provides the ODBC cursor library in that way and we have used it(indirectly) for a long time. It's the reason why ODBC users don't complain about the non-existence of updatable cursors that often. Must I repeat the implementation ? regards, Hiroshi Inoue
Tom Lane wrote: > >> What's wrong with 64-bit oids (except extra 4bytes)? > > > Portability, mostly. > > Oh, there's one other small problem: breaking the on-the-wire protocol. So 8-byte-OID is for PostgreSQL 8? :-) -- Alessio F. Bragadini alessio@albourne.com APL Financial Services http://village.albourne.com Nicosia, Cyprus phone: +357-2-755750 "It is more complicated than you think" -- The Eighth Networking Truth from RFC 1925
Tom mentioned what should be stored in the OID system column if no oid's are in the table. He also mentioned that he doesn't want a variable-length tuple header so will always have an oid system column. What about moving the oid column out of the tuple header. This saves 4 bytes in the header in cases where there is no oid on the table. If they ask for an OID in a table, make it the first column of a table. Also, if they have asked for oid's on the table, odds are they want SELECT * to show it. Also, how about a GUC option that controls whether tables are created with OID's by default. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Bruce Momjian <pgman@candle.pha.pa.us> writes: > What about moving the oid column out of the tuple header. This saves 4 > bytes in the header in cases where there is no oid on the table. No it doesn't --- at least not on machines where MAXALIGN is eight bytes. I don't think this is worth the trouble... regards, tom lane
On Thursday 19 July 2001 06:08, you wrote: > > Bruce Momjian <pgman@candle.pha.pa.us> writes: > I think it should be off on user tables by default, but kept on system > tables just for completeness. It could be added at table creation time > or from ALTER TABLEL ADD. It seems we just use them too much for system > stuff. pg_description is just one example. and what difference should it make, to have a few extra hundred or thousand OIDs used by system tables, when I insert daily some ten thousand records each using an OID for itself? Why not make OIDs 64 bit? Might slow down a little on legacy hardware, but in a couple of years we'll all run 64 bit hardware anyway. I believe that just using 64 bit would require the least changes to Postgres. Now, why would that look that obvious to me and yet I saw no mentioing of this in the recent postings. Surely it has been discussed before, so which is the point I miss or don't understand? I would need 64 bit sequences anyway, as it is predictable that our table for pathology results will run out of unique IDs in a couple of years. Horst
Would it be possible to offer an option for the OID column to get its value from an int4 primary key (settable on a per table basis maybe)? - Stuart > -----Original Message----- > From: Hiroshi Inoue [SMTP:Inoue@tpf.co.jp] > Sent: Saturday, July 21, 2001 7:31 AM > To: Zeugswetter Andreas SB > Cc: PostgreSQL-development > Subject: RE: OID wraparound (was Re: pg_depend) > > > -----Original Message----- > > Zeugswetter Andreas SB > > > > > As I mentioned already I'm implementing updatable cursors > > > in ODBC and have half done it. If OIDs would be optional > > > my trial loses its validity but I would never try another > > > implementation. > > > > But how can you do that ? The oid index is only created by > > the dba for specific tables, thus your update would do an update > > with a where restriction, that is not indexed. > > This would be darn slow, no ? > > > > Please look at my another(previous ?) posting to pgsql-hackers. > I would use both TIDs and OIDs, TIDs for fast access, OIDs > for identification. > > > How about instead selecting the primary key and one of the tid's > > (I never remember which, was it ctid ?) instead, so you can validate > > when a row changed between the select and the update ? > > > > Xmin is also available for row-versioning. But now I'm wondering > if TID/xmin are guranteed to keep such characteriscs. > Even Object IDentifier is about to lose the existence. > Probably all-purpose application mustn't use system columns > at all though I've never heard of it in other dbms-s. > > regards, > Hiroshi Inoue
lamar.owen@wgcr.org (Lamar Owen) wrote in message news:<01071818103609.00973@lowen.wgcr.org>... > [trimmed cc:list] > On Wednesday 18 July 2001 17:09, Bruce Momjian wrote: > > OK, we need to vote on whether Oid's are optional, and whether we can > > have them not created by default. > > [All the below IMHO] > > OID's should be optional. yep. we don't depend upon oids > 32 bits. that's pretty standard practice for serious db apps. however, tx limit is a real problem. my vote is for solving the tx limit before chaning the oid problem.
"Henshall, Stuart - WCP" wrote: > > Would it be possible to offer an option for the OID column to get its value > from an int4 primary key (settable on a per table basis maybe)? > - Stuart > Sorry I don't understand well what you mean. What kind of advantages are there if we let OIDs be optional and allow such options like you offer ? regards, Hiroshi Inoue
I was thinking that this would help stop OID wrap around while not totally breaking clients that used OIDs as row identifiers as they'd now have the int4 primary key value (although I guess there could be risks if the client assumes there'd be globally unique). Also the primary key would have to be placed into the OID in all places it could be referenced (for WHERE clauses,etc...). It'd only work on those tables that had int4 priamary keys, but I suspect thats a fair few. I don't know wether this'd be worth while, but was rather throwing it out for thought. - Stuart > -----Original Message----- > From: Hiroshi Inoue [SMTP:Inoue@tpf.co.jp] > Sent: Tuesday, July 24, 2001 2:37 AM > To: Henshall, Stuart - WCP > Cc: 'pgsql-hackers@postgresql.org' > Subject: Re: [HACKERS] RE: OID wraparound (was Re: pg_depend) > > "Henshall, Stuart - WCP" wrote: > > > > Would it be possible to offer an option for the OID column to get its > value > > from an int4 primary key (settable on a per table basis maybe)? > > - Stuart > > > > Sorry I don't understand well what you mean. > What kind of advantages are there if we let OIDs be optional > and allow such options like you offer ? > > regards, > Hiroshi Inoue