代码之家  ›  专栏  ›  技术社区  ›  Moeb

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

  •  2
  • Moeb  · 技术社区  · 15 年前

    This Oracle documentation page 提到

    …最后创建long类型的列

    但不说为什么。

    将它们存储在一行末尾的原因是什么?

    3 回复  |  直到 9 年前
        1
  •  5
  •   Dean Harding    15 年前

    LONG 在Oracle中与 long 在C或C++中。在Oracle中 有点像 VARCHAR2 但最大长度更大(我想是2GB?)

    它最后存储的原因是如果您有一个表 (INT a, LONG foo, INT b) 它是按这个顺序存储的,然后为了获取 b 列,它必须读取 所有数据页 它被 列。通过在最后存储,如果不需要的话,它不需要读取所有的数据。

        2
  •  4
  •   Gary Myers    15 年前

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

    从开发人员的角度来看,long可以是第三列、第六列或第一列,或者任何地方。您仍然可以将列添加到一个长的表中。也就是说,您几乎肯定不应该再创建一个长的表。它们应该是木块(或木块,而不是长的生的)。

    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
    

    我的猜测(除非为甲骨文工作的人公开表态,这是推测)是因为多头很可能“不适合”一个区块中的行。一行有一个长的将有很好的机会需要超过1块大小。多头最有可能被分开(因为它的大小)。通过将其推到最后,其他所有列更有可能一起放在一个块上。

        3
  •  1
  •   Damien_The_Unbeliever    15 年前

    (不是甲骨文的专家-只需看看长的是什么)

    一般来说,long(和其他blob类型)不受搜索条件(在join或where子句中)的约束。因此,将它们移到末尾是有意义的,这样其他列(更可能一起查询)就可以紧密地位于一起。然后,在评估此特定行是否符合查询条件时,只需要读取这些其他列。