索引表

索引表
 
索引表的机制实现不同于数组,pl/sqltable实现类似于数据库中的表,
 
它有两列:keyvalue. key的类型是binary_integer,
value
 
的类型是is table of data_type中的data_type指定的数据类型
.
 key  value
 1   abc
 3   bcd

索引表的一些特性:
 
索引表是将数据保存在内存中!
 
索引表是不受约束的,最大值是binary_integer的取值范围
 pl/sql
索引表的元素没有必要按照特定的次序排序,元素可以按照任意键进行插入
 pl/sql
索引表使用键(key)没有必要是顺序的,所有binary_integer数据或表达式都可以作用表的索引

定义索引表
 --
定义记录集
  TYPE yang_rec IS RECORD( ename varchar2(30), eid NUMBER );
 --
定义索引表类型
  TYPE yang_tab IS TABLE OF yang_rec INDEX BY BINARY_INTEGER;
 --
定义索引表对象的实例
  test_tab yang_tab;

将条目插入到索引表中
 
索引表中的每个元素都由一个唯一的整型值(索引)标识。引用表中的值时,必须提供该值的索引。
 
索引的范围:1 ---- 2147483647,索引值可以不连续,同时PL/SQL并不为没有使用的条目预留空间。
 
例如:
  DECLARE
  CURSOR all_emps IS SELECT * FROM employee ORDER by emp_id;
  TYPE emp_table IS TABLE OF employee%ROWTYPE INDEX BY BINARY_INTEGER;
  emps emp_table;
  emps_max BINARY_INTEGER;
  BEGIN
  emps_max := 0;
  FOR emp IN all_emps LOOP
  emps_max := emps_max + 1;
  emps(emps_max).emp_id := emp.emp_id;
  emps(emps_max).emp_name := emp.emp_name;
  END LOOP;
  END;
  /

索引表中进行操作
 1)
插入:见上例。
 
2) 引用:
  IF emps.EXIST(10) THEN
  DBMS_OUTPUT.PUT_LINE('
存在第10条记录。');
  END IF;
 3)
修改:

 
修改emps 表中的第100个条目:
  emps(100).emp_name := 'yang linker';
 4)
删除:
 --
删除emps 表中的第100个条目:
  emps.DELETE(100);
 --
删除emps 表中的从1100的条目:
  emps.DELETE(1, 100);
 --
删除emps 表中的的所有条目:
  emps.DELETE;

索引表中的函数
 1) count
:返回表的条目数量:
  num_rows := emps.COUNT;
 2) EXISTS
:如果指定的条目存在,则返回为真;否则为假。
  IF emps.EXIST(10) THEN
  DBMS_OUTPUT.PUT_LINE('
存在第10条记录。');
  END IF;
 3) LIMIT
:该方法返回集合可以包含的最大元素数目。
只有变长数组才有上限。将LIMIT 用于嵌套表和索引
 
表时,其返回为NULL
 
4) FRIST:该方法返回集合中使用的最小的索引值。
 5) LAST
:该方法返回集合中使用的最大的索引值。
 6) NEXT
:该方法返回集合中当前使用的下一个索引值。
 
7) PRIOR:该方法返回集合中当前使用的上一个索引值。
 8) DELETE
:删除集合中的条目,见前例。
 9) TRIM
:从集合的尾部删除一个或多个条目,无返回值,只适用于变长数组和嵌套表。
  emps.TRIM(1); --
从集合的尾部删除一个条目
  emps.TRIM(3); --
从集合的尾部删除三个条目
 10) EXTEND
:在集合的尾部添加条目或复制已有的条目,只适用于变长数组和嵌套表。
 
emps.EXTEND(1); -- 从集合的尾部添加一个条目
  emps.EXTEND(3); --
从集合的尾部添加三个条目
  emps.EXTEND(1, 3);--
复制集合的第三个条目,并将其添加到表的末尾。

 

 

 

 

索引表与标准表的差异

 

Java代码 复制代码
  1. 一、索引表中的ROWID列存放的是【逻辑】物理地址。而标准表的ROWID伪列中存储的则是真实的物理地址,这是两者之间最本质的区别。另外其他几个方面的差异都是因为有这个差异存在而存在。或者说,它是索引表优势的根源。  

一、索引表中的ROWID列存放的是【逻辑】物理地址。而标准表的ROWID伪列中存储的则是真实的物理地址,这是两者之间最本质的区别。另外其他几个方面的差异都是因为有这个差异存在而存在。或者说,它是索引表优势的根源。

 

 

 

  1. 二、索引表对记录的访问是基于主键的,也就是说,根据逻辑的ROWID。而标准表在访问记录的时候,则是通过物理的ROWID地址。  

二、索引表对记录的访问是基于主键的,也就是说,根据逻辑的ROWID。而标准表在访问记录的时候,则是通过物理的ROWID地址。

 

 

 

  1. 三、表的扫描方式不同。若采用索引表的话,则数据库是通过全索引扫描方式访问相关的记录;而若采用标准表的话,则是通过顺序扫描的方式访问相关的记录。这两者访问方式在性能上有很大的差异。全索引扫描方式,可能提供更高的查询性能。  

三、表的扫描方式不同。若采用索引表的话,则数据库是通过全索引扫描方式访问相关的记录;而若采用标准表的话,则是通过顺序扫描的方式访问相关的记录。这两者访问方式在性能上有很大的差异。全索引扫描方式,可能提供更高的查询性能。

 

 

 

四、对于主键的要求不同。在建立标准表的时候,不一定要指定主键。但是,若用户在建立索引表的时候,则必须给表建立主键,使用主键来唯一表示一行记录。很简单,在索引表中,ROWID伪列中就存储着主键信息。若不指定具体的主键的话,数据访问时就不能够对记录进行定位。  

四、对于主键的要求不同。在建立标准表的时候,不一定要指定主键。但是,若用户在建立索引表的时候,则必须给表建立主键,使用主键来唯一表示一行记录。很简单,在索引表中,ROWID伪列中就存储着主键信息。若不指定具体的主键的话,数据访问时就不能够对记录进行定位。

 

 

 

      索引表与标准表的差异只是停留在数据库开发的层面,或者说,只是内部存储结构上有一定的差异。但是,在用户使用它们的时候,没有任何的差异。在前台应用程序设计的时候,用户可以向普通表那样访问索引表。这就给索引表的应用排除了使用上的障碍。

 

 

 


在Oracle中,可以通过创建索引空间来为索引数据提供存储空间。在创建索引空间之前,需要先创建一个普通的空间作为索引空间的存储位置。以下是创建索引空间的步骤: 1. 首先,创建一个普通的空间。可以使用以下语句创建一个空间: ```sql CREATE TABLESPACE index_tablespace DATAFILE 'path_to_datafile' SIZE 100M; ``` 其中,index_tablespace是空间的名称,path_to_datafile是空间的数据文件路径,SIZE 100M示数据文件的初始大小为100MB。 2. 接下来,使用以下语句创建一个索引空间,并将其指定为索引的存储位置: ```sql ALTER TABLESPACE index_tablespace ADD DATAFILE 'path_to_index_datafile' SIZE 50M; ``` 其中,index_tablespace是之前创建的普通空间的名称,path_to_index_datafile是索引空间的数据文件路径,SIZE 50M示数据文件的初始大小为50MB。 通过以上步骤,您就成功创建了一个索引空间,并可以将索引数据存储在该空间中。请根据实际需求调整空间的大小和属性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [oracle创建空间](https://blog.csdn.net/weixin_45213302/article/details/113238654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值