Martijn van Oosterhout <kleptog@svana.org> writes: > So you end up storing the typmod in the Datum itself, which brings you > right back to varlena.
Not really since the Datum doesn't actually end up on disk in the case of pass-by-reference. which leads us to: > Well, the root of the problem depends on your perspective. If the > purpose behind all of this is to save disk space, perhaps the root of > the problem is that disk representation and memory representation are > intimately tied? Indeed. Consider this real table definition I found in a few moments searching for schemas on google: PRVDR_CTRL_TYPE_CD: CHAR(2) PRVDR_NUM: CHAR(6) NPI: NUMBER RPT_STUS_CD: CHAR(1) FY_BGN_DT: DATE FY_END_DT: DATE PROC_DT: DATE INITL_RPT_SW: CHAR(1) LAST_RPT_SW: CHAR(1) TRNSMTL_NUM: CHAR(2) FI_NUM: CHAR(5) ADR_VNDR_CD: CHAR(1) FI_CREAT_DT: DATE UTIL_CD: CHAR(1) NPR_DT: DATE SPEC_IND: CHAR(1) FI_RCPT_DT: DATE By my count postgres would use 154 bytes for this record. Whereas in fact there's no need for it to take more than 87 bytes. Almost 100% overhead for varattlen headers and the padding they necessitate. This is not a pathological example. This is a very common style of database schema definition. Many many database tables in the real world are a 1-1 translations of existing flat file databases which have lots of short fixed length ascii codes. Any database interacting with any old school inventory management systems, financial databases, marketing database, etc is likely to be of this form. So it seems what has to happen here is we need a way of defining a data type that has a different on-disk representation from its in-memory definition. That means a lot more cpu overhead since I imagine it will mean pallocing the in-memory representation before you can actually do anything with the data. The disk reader and writer functions could probably use the typmod but it seems what they really want to have access to is the attlen because what they really want to know is the length of the object that their pointer refers to. -- Gregory Stark EnterpriseDB http://www.enterprisedb.com ---------------------------(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