2010-08-11 60 views
2

This Oracle documentation page提到在Oracle中,为什么最后创建LONG类型的列?

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

但没有说为什么。

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

+0

为什么这有'算法'标签? – MAK 2010-08-11 10:59:32

+0

@MAK:嗯,在**中存储什么命令是一个问题,然后有一个解决方案指定了一种解决问题的方法,它具有自己的优点和缺点。不算'算法' - 值得吗? – Moeb 2010-08-11 11:35:49

回答

5

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

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

1

(不是专家在甲骨文 - 只是不得不寻找一个LONG是什么)

在一般情况下,多头(和其他BLOB类型)都不会受到搜索条件(连接或WHERE子句)。因此,将它们转移到最后是有意义的,这样其他列(它们更可能被一起查询)紧密地位于一起。然后,只有这些其他列需要阅读,同时评估此特定行是否与查询条件匹配。

4

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

从开发者的角度来看,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的人很可能需要超过1个街区。 LONG最有可能分裂(因为它的大小)。通过将其推到最后,所有其他列更可能坐在一个块上。

相关问题