
文中大部分观点均来自Thomas Kyte的《Expert.Oracle.Database.Architecture.9i.and.10g.Programming.Techniques.and.Solutions》一书1 ALTER TABLE 表名 ENABLE ROW MOVEMENT 允许oracle改变分配给每行的rowid。否则flashback时会报“ORA-08189: cannot flashback thetable because row movement is not enabled”。rowid是在insert时分配的。flashback会对表做delete再重新插入因此可能分配到不同的新rowid.2 10g以前查询dual会产生对数据字典中一个真实的名为“dual”表的全表扫描。SELECT DUMMY FROM DUAL或者SELECT rowid FROMDUAL会在oracle所有版本观察到I/O.如果在9i及之前的版本查询sELECT SYSDATE FROM DUAL或者在PL/SQL中书写variable : SYSDATE都会发生真实的I/O。但在10gSELECTSYSDATE被视为不需要查询dual表并按照类似于调用函数的方式。因此如果仅取sysdate就不再全表扫描dual了3 rowid仅在同一表中唯一不同表的可能出现相同的rowid4 B*Tree index底层叶节点存放rowid5 可能导致rowid发生变化的操作1update分区表用于分区的列使得某行必须由一个分区移动到另一个2move操作移动表所属的表空间和一些分区操作比如splitting or merge partitions拆分或者合并分区3用ALTER TABLE SHRINK SPACE做segment shrink表收缩通过insertdelete重组数据使数据分布更紧密同时降低HWM释放空闲数据块4更新索引组织表iot的主键6 rowid可以随时变化不推荐将其物理存储在数据库表列中使用rowid作为列的数据类型会被视为“bad practice”加以避免。应使用主键代替7 rowid是找到表中一行的最快方式可以用于update无索引和主键的表但要求和其他条件一同使用以免受到rowid变化的影响8 数据库间的copy或导入导出都会引起ROWID和UROWID的变化