在Oracle中,为什么LONG类型的列最后创建?

时间:2010-08-11 06:44:58

标签: database oracle algorithm database-design

This Oracle documentation page提及

  

...最后创建LONG类型的列

但不说明原因。

可以将它们存储在行尾的原因是什么?

3 个答案:

答案 0 :(得分:5)

Oracle中的LONG与C或C ++中的long完全不同。在Oracle中,LONG有点像VARCHAR2,但最大长度更大(2GB,我相信?)

它最后存储的原因是因为如果你有一个(INT a, LONG foo, INT b)的表并且它按照那个顺序存储,那么为了获取b列的值,它必须读入LONG列占用的所有数据页。通过将其存储在最后,如果没有必要,则不必读入所有数据。

答案 1 :(得分:4)

值得指出的是,这只是内部存储。

从开发人员的角度来看,LONG可以是第三列,第六列或第一列,也可以是任何地方。您仍然可以使用LONG向表中添加列。也就是说,你几乎肯定不应该再创建一个LONG表了。它们应该是CLOB(或BLOB而不是LONG RAW)。

create table test_long (id number, val long, create_date date);

desc test_long
           Name                           Null?    Type
           ------------------------------ -------- --------------
    1      ID                                      NUMBER
    2      VAL                                     LONG
    3      CREATE_DATE                             DATE

我的猜测(除非为甲骨文工作的人说出来,这是猜测)是因为LONG最有可能“不适合”一个块中的行。具有LONG的行将很有可能需要超过1个块的大小。 LONG最有可能被拆分(因为它的大小)。通过将其推到最后,所有其他列更可能在一个块上坐在一起。

答案 2 :(得分:1)

(不是Oracle专家 - 只需要查看LONG是什么)

通常,LONG(和其他BLOB类型)不受搜索条件的限制(在JOIN或WHERE子句中)。因此,将它们移动到最后是有意义的,以便其他列(更可能被一起查询)紧密地定位在一起。然后,只需要读取这些其他列,同时评估此特定行是否与查询条件匹配。