tom的oracle 9i&10g编程艺术中这样一句话:在一个非唯一索引中,oracle会把rowid作为一个额外列加到键上,使索引键为唯一; 先按索引键排序,再按rowid升序排序;在一个唯一索引中,不会再加rowid到索引键上。
这个怎么理解呢?唯一索引的索引键不保存rowid,那怎么通过rowid查找数据表中某行的值呢。下面的内容是通过google搜索得来,来源:http://www.itpub.net/thread-1287023-1-1.html
下面是一个完整的用例,使用了数据DUMP技术。
SQL> conn / as sysdba
已连接。
SQL> create table t as select * from dba_objects;
表已创建。
SQL> create index t_idx on t(object_id);
索引已创建。
SQL> select t.header_file,t.header_block from dba_segments t
2 where t.segment_name='T';
HEADER_FILE HEADER_BLOCK
----------- ------------
1 58408
SQL> alter system dump datafile 1 block 58410;
系统已更改。
普通索引,内容如下:
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 00 40 e4 29 00 30
SQL> drop index t_idx;
索引已删除。
SQL> create unique index t_idx on t(object_id);
索引已创建。
SQL> select t.header_file,t.header_block from dba_segments t
2 where t.segment_name='T_IDX';
HEADER_FILE HEADER_BLOCK
----------- ------------
1 92136
SQL> alter system dump datafile 1 block 92138;
系统已更改。
SQL>
唯一索引,内容如下:
row#0[8025] flag: ------, lock: 0, len=11, data:(6): 00 40 e4 29 00 30
col 0; len 2; (2): c1 03
可以看出,在非唯一索引中,Oracle会增加一列,用于存放对应rowid,即索引列的最后,并按照这个顺序排序。对于唯一索引,是放入data(6)中,即row header中。不论怎样,rowid还是会被存储的。
分享到:
相关推荐
4. **唯一性和非唯一性索引**:唯一索引确保键值的唯一性,非唯一索引则可能需要rowid作为额外列来确保条目的唯一性。非唯一索引中,数据会先按键值排序,再按rowid升序排序。 5. **索引的选择性**:选择性高的索引...
* INDEX 创建:使用 rowid 来创建索引,以提高查询效率。 * 数据迁移:使用 rowid 来迁移数据,以保持数据的一致性。 六、rownum 的应用 rownum 可以用于各种数据报表和查询,例如: * 分页:使用 rownum 来实现...
- **索引与ROWID**:ROWID是指Oracle为每一行分配的唯一地址。索引可以通过ROWID快速定位到表中的具体行。 - **索引的选择性**:索引的选择性是指索引键值在表中出现的独特程度。如果索引键具有高选择性(例如,护照...
唯一性索引不允许数据重复。非唯一性索引则允许。 (3)两列比一列好:Oracle 允许用户建立复合索引,这种索引针对多个表列。 (4)where 子句和索引:Oracle 根据用户在 where 子句中的定义找出满足查询要求的...
6. **唯一索引**:确保索引键值的唯一性,每个键值对应一个ROWID,防止重复数据。 7. **非唯一索引**:允许键值重复,每个键值可能对应多个ROWID,索引数据按照键值和ROWID共同排序。 索引的优化涉及多个方面,...
- 函数索引是在索引中保存了数据列经过函数处理后的值。当查询涉及到对某列应用相同函数时,如`SELECT * FROM table WHERE function(column) = value`,函数索引能够显著提高查询速度。系统可以直接使用索引来匹配...
位图索引适合于低基数(即唯一值少)的列,它用位图表示每个值,节省空间但不适用于高并发的事务处理。函数索引允许对列应用函数后再创建索引,使得查询可以使用函数结果进行查找。 了解索引的基本概念后,我们关注...
**ROWID**是Oracle中用来唯一标识表中每一行的一个地址,通过ROWID可以直接访问到数据行,它是索引查找的重要部分。 组合索引是指在一个索引中包含多个列,这有助于优化多列查询条件的性能。但是,如果查询条件中只...
2. **使用索引的情况**:若在`name`字段上建立了索引,Oracle会在全表扫描的基础上,将每条记录的`name`值按升序排列,并构建索引条目(包含`name`和`rowid`),存储到索引段中。这样,当查询`name='wish'`时,可以...
创建和管理索引时,需要注意索引的类型(如分区或非分区,B树或位图索引),以及是否需要使用唯一索引来保证数据的唯一性。此外,优化索引策略包括选择合适的数据类型,避免在索引列上使用函数,以及适时使用覆盖...
在Oracle 8.0.3之前的版本中只能使用限制性rowid,从Oracle 8.0.3开始,Oracle主要使用扩展的rowid,限制性rowid很少使用, 一般只用于确定非分区表的非分区索引表中的行位置。 扩展性rowid的结构 扩展性rowid的...
位图索引适用于低基数(即唯一值较少)的列,如性别或布尔值;函数索引允许在索引中应用函数,使得查询时能直接使用函数结果;而interMedia全文索引则用于全文本搜索。 了解基本的索引概念,可以通过查询`DBA_...
而反向索引通过反转索引键中的字节顺序,使得原本连续的键值分散到不同的叶块中,从而均衡负载,减少索引块的争用情况。 然而,反向索引并非万能解药,它在某些场景下存在限制。例如,在进行范围查询(`WHERE column...
ROWID是一种特殊的索引形式,它实际上是一个指向表中每一行物理位置的地址。通过ROWID,可以直接定位到某一行数据,这对于快速检索数据非常有用。ROWID在Oracle中是一种特殊的数据类型,可以通过它来快速访问特定的...
2. `RENAME`表不影响索引,因ROWID不变。 总结: 1. 判断是否重建索引,可通过`ANALYZE INDEX`和`index_stats`表进行评估。 2. 重建索引有删除重建(不推荐)、`ALTER INDEX REBUILD`(推荐,尤其是在线模式)和`...
ROWID是指向表中某一行在物理存储上的唯一标识,它包含了该行在磁盘上的精确位置。通过索引中的ROWID,Oracle能够在物理上快速定位到所需的行,而无需逐行扫描整个表。 索引的工作原理可以通过以下步骤来理解: 1....
此外,还有唯一索引和非唯一索引,前者不允许索引值重复,后者则允许重复,主键列通常要求创建唯一索引。 总之,Oracle索引是优化数据库性能的关键元素,理解其概念、原理和类型对于有效管理和优化数据库至关重要。...
2. 唯一索引:确保索引列中的每个值都是唯一的,不允许重复。 3. 位图索引:适用于基数较小的列,尤其适合于进行等值查询,而不是范围查询。 4. 局部有前缀和无前缀分区索引:这些是针对分区表的索引,有助于在特定...