oracle 学习笔记

1、oracle Index

2、oracle 创建表空间语法

3、oraclee 创建存储过程 

 

Oracle

索引结构扫描,获取待返回数据行的ROWID
根据获取的ROWID扫描表,获取对应数据行,并返回
ROWID的扫描方式其实就是索引扫描的第二个动作,换而言之,索引扫描的目标就是通过ROWID扫描的方式从表中获取查询数据行... ROWID扫描方式是查询数据最快的方式,索引检索的本质是转换ROWID扫描取数。


一、索引唯一扫描是最高效的索引扫描方式,其只对唯一键索引上的等值查询有效
二、使用一个索引存取多行数据时,这种索引扫描方式为"索引范围扫描"(index range scan).与索引唯一不同。索引范围扫描可以发生在唯一键索引上,也可以发生在非唯一键索引上。比如:
^^^^^^^^在唯一索引列上使用了范围操作符(如: >、<、<>、>=、<=、between 即不等值查询);
^^^^^^^^对非唯一索引列上进行的查询;
三、索引全扫描(index full scan)与全表扫描是非常类似的;它将先扫描索引全部节点和条目,再选择对应数据进行排序输出。索引全扫描只在CBO模式才有效.CBO根据统计数值得知进行索引全扫描比进行全表扫描更有效时,才进行索引全扫描,而且此时查询出的数据必须从索引中可以直接得到;
什么情况下;会使用索引全扫描呢?
^^^^^^^^表和表进行排序合并联立(sort-merge join)查询的时候,排序的列必须是存在于索引中的;
^^^^^^^^查询中有order by 和group by 子句的时候,子句中所有的列是必须存在于索引中.

与全表扫描相比,索引全扫描的优势在哪里呢?
1、全表扫描过程是不进行排序的,必须将数据全部取出来后再进行排序输出,其扫描目标表HWM所有数据块,包括没有必要的空快.
2、因为索引结构本身就是一个有序的结构,索引全扫描在遍历索引的同时就已经完成了排序操作,在输出结果的时候是不需要在排序,再者其通过ROWID获取行数据,避免了空块的读取. #######索引全扫描过程是单块读取;其不支持多块并行的读取,输出结果是有序排列的,########

四、索引快速全扫描
索引快速全扫描(INDEX FAST FULL SCAN)是扫描索引中的所有数据块,与index full scan 很类似,最显著的区别就是它不对查询出的数据进行排序,即数据不是以排序的顺序返回。在这种存取方法中,可以使用多块读的功能,也可以使用并行读,以便获得最大吞吐量并缩短执行时间,
############ 索引快速全扫描是一种比较高效的扫描方式,在优化过程中,可以尽量多使用。


五、索引跳跃扫描
索引跳跃扫描(INDEX SKIP SCAN)是oracle 9I 引进的一个新特性,其发生在复合索引上,如果SQL语句中where子句只包含索引中的部分列,且这些列不是索引的第一列,就可能发生INDEX skip Scan。如果在查询时,第一列没有指定,就跳过它。


B树索引内部结构:
根节点:只有一个根节点,是位于树的最顶端的分支节点;
分支节点:存储指向索引里其他分支节点或者叶节点;
叶子节点:存储索引条目(包括索引条目头信息、索引键值长度、索引键值,以及ROWID相关信息)直接指向表里的数据行。

每个索引条目包含两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值,而对于复合索引来说则是多值组合在一起的。第二个字段表示该键值所对应的数据行的ROWID,该ROWID是数据行在表里的物理地址。

索引这个特点是不同于表的,DML操作过程中,对索引维护成本是比较大的。所以我们需要定期地分析索引的结构,保证其高效支持查询的能力。


输出排序:
索引唯一扫描:这种扫描方式。输出的结果集只有一个记录行,就不存在排序的问题。
索引范围扫描:该方式是索引排序最经典的应用,其输出结果集都是有序的(升序输出还是降序输出取决于索引创建时的参数,默认为升序):
索引全扫描:这个方式可以看做是全范围的扫描,其效果和索引范围扫描是一样的;
索引快速扫描:从字面上看,和索引全扫描非常相像,但两者是完全不同的两种方式,快速全扫描的输出结果集是不排序的,如果where子句中要求order by,则需要额外的排序开销
索引跳跃扫描:可以视作是分拆多个逻辑子索引后的INDEX COMBINE扫描,对于逻辑子索引的扫描几位索引范围扫描或索引全扫描。

 

Oracle 11G 创建表空间的语句
/*分四步*/
/*第一步:创建临时表空间 */

create temporary tablespace user_temp
tempfile 'E:\oracle\oradate\oracle11G\user_temp.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;


/*第二步:创建数据表空间  */
create tablespace user_data
logging
datafile 'E:\oracle\oradate\oracle11G\user_data.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extend management local;


/*第三步: 创建用户并指定表空间 */
create user  sys  identified by firefox123
default tablespace user_data
temporary tablespace user_temp;

/*第四步: 给用户授予权限 */
grant connect,resource,dba to sys;




Oracle 11G

创建视图

CREATE VIEW v_myview
AS
select * from user$  WHERE user# > 10;

SELECT USER#, name  FROM v_myview







Oracle 11G
创建批量插入的存储过程;


oracle 创建表:
例子: create table alex_t05 (id number, name varchar2(100));

Oracle 创建索引;
:create index idx_alex_t05_id on alex_t05 (id);

oracle 开启10224跟踪事件日志;日至级别为1;
alter session set events '10224 trace name context forever,level 1';


oracle 关闭10224跟踪事件

oracle 存储过程; 

begin
for i in 3001..10000 loop
   insert into alex_t05 values (i,'alex');
end loop;
commit;
end;
/

 

posted @ 2015-01-28 17:59  想想宝宝  阅读(202)  评论(0)    收藏  举报