ROWID唯一性

在oracle数据库中rowid是唯一的吗,或许很多人第一反应都是这么认为。这种说法其实并不准确,应该说在oracle 8以前,在整个数据库层面rowid是唯一的,而从oracle 8开始,在数据库层面rowid并不是全局唯一的,针对表空间来说,存储在其中的数据的rowid则是相对唯一的。

我们知道在数据库中存放的每一条记录都有一个ROWID ,代表着这条记录在数据库存放的物理地址。

从oracle 8开始ROWID的格式发生了变化,大小也从8字节增加到了10个字节。当你对某个表进行重组或者导出导入,则ROWID会变化。比如对于一个分区表来说,如果通过update语句将数据行从一个分区迁移到另一个分区,则其rowid会发生变化。

Oracle 7格式

在Oracle 7中ROWID由8个字节组成:

  • 字节1到4 (bits 1 to 32): 数据块编号 (0-4294967295)
  • 字节5到6 (bits 33 to 48): 数据块里的行编号 (0-65535)
  • 字节7到8 (bits 49 to 64): 数据文件编号(0-65535)

每个字节由2个16进制的字符表示 (0-9A-F),同时每个部分由圆点隔开: BBBBBBBB.RRRR.FFFF

这个时候数据库里文件数最大为1022,当时使用已经足够,而随着业务的不断发展,所需要的文件数也越来越大,1022也明显不够用。到oracle 8时,想增加数据文件数量的同时又不想修改已有数据的rowid,因为这会牵涉到在升级过程中需要修改所有数据块的巨大工作量,所以对rowid的组成部分进行了变更。

阅读更多

Automatic Memory Management简析

从11g开始引入了AMM(Automatic Memory Management)的概念,AMM管理了SGA+PGA的内存分配,它允许将内存在SGA和PGAs之间进行转移,你只需要指定MEMORY_TARGET一个参数即可,剩下的事情全部交给oracle自己来做。

这里首先解释几个名词:

  • System global area (SGA)

    SGA是一组共享内存结构,作为SGA组件,包含了一个oracle实例中的数据和控制信息。所有server和后台进程都共享SGA,SGA的数据包括缓存数据块和共享SQL区。

  • Program global area (PGA)

    PGA是一块非共享的内存区域,单独存放每个oracle进程的数据和控制信息。当进程开始运行时oracle就会自动为这个进程创建pga,每个服务进程和后台进程都有一个PGA,而所有PGA的集合就构成了整个实例的PGA,数据库的初始化参数设置了整个实例的PGA大小。

  • User global area (UGA)

    UGA是每个用户会话的内存

阅读更多