答案 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子句中)。因此,将它们移动到最后是有意义的,以便其他列(更可能被一起查询)紧密地定位在一起。然后,只需要读取这些其他列,同时评估此特定行是否与查询条件匹配。