Oracle 数据库
Oracle Database,名Oracle RDBMS,或简称Oracle。是 甲骨文公司 的一款 关系数据库管理系统 。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的 关系数据库 管理系统,系统 可移植性 好、使用方便、功能强,适用于各类大、中、小 微机 环境。它是一种高效率的、可靠性好的、适应高 吞吐量 的数据库方案。
创建用户
– Create user 创建一个用户
– Identified by 密码
– Default tablespace users 默认表空间
–Temporary tablespace temp 临时表空间
– Quota unlimited on users 表空间配额
–给用户赋权限
–Grant connect,resource to
–修改用户密码
–Alter user identified by 修改密码
–撤销用户权限
–revoke 权限 from
–删除用户
–Drop user cascade
数据控制语言(DCL): grant 授权 revoke 撤销
数据定义语言(DDL):create 创建 alter 修改 drop 删除
一、create语句
基本语法:CREATE (创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)
常用的字段类型有
 CHAR  固定长度的字符串
 VARCHAR2  可变长度的字符串    
 NUMBER (M,N) 数字型M是位数总长度, N是小数的长度 
 DATE 日期类型
 INT  整数型
 
创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面,
创建表时可以用中文的字段名, 但最好还是用英文的字段名,
创建表时可以给字段加上默认值, 例如  DEFAULT  SYSDATE这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如: 不允许重复  UNIQUE , 主键  PRIMARY   KEY  ,外键Foreign key
 
二、alter语句
语法 ALTER (改变表, 索引, 视图等)
1.改变表名
ALTER   TABLE  表名1  TO  表名2;
2.增加字段
ALTER  TABLE表名  ADD  字段名(列) 字段名描述;
增加一列
ALTER TABLE table_name ADD column_1 DATE NOT NULL;
ALTER TABLE table_name ADD column_2 VARCHAR2(44) DEFAULT '';
ALTER TABLE table_name ADD column_3 number(28,10);

增加多列
ALTER TABLE table_name
ADD (
column_1 type constraint,--列名 类型 约束
column_2 type constraint,
);

3.删除字段
删除一列
ALTER TABLE table_name DROP COLUMN column_name;
删除多列
ALTER TABLE table_name DROP (column_1,column_2,...);

4.修改表里字段的定义描述
ALTER  TABLE表名 MODIFY 字段名 字段名描述;
 
5.给表里的字段加上约束条件
ALTER   TABLE  表名  ADD   CONSTRAINT  约束名  PRIMARY   KEY  (字段名);
 
ALTER   TABLE  表名  ADD   CONSTRAINT  约束名  UNIQUE  (字段名);
 
5.把表放在或取出数据库的内存区
ALTER   TABLE  表名 CACHE;
 
 ALTER   TABLE  表名 NOCACHE;
 
三、drop语句
基本语法:DROP (删除表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)
 
删除表和它所有的约束条件
DROP   TABLE  表名  CASCADE  CONSTRAINTS
 
四、 TRUNCATE (清空表里的所有记录, 保留表的结构)
 
 TRUNCATE  表名;
五、 SELECT 查询
普通单表查询:
SELECT * FROM 表名  (查询效率低下一般不建议使用,因为这种SQL语句是* 会把表里的全部查询出来)
SELECT 字段名 FROM 表名 (建议使用单表查询语句,指定字段查询而不是把全部的字段查询出来)
条件查询:
相等条件查询:
SELECT 字段名 FROM 表名 WHERE 字段名=查询内容
不相等条件查询:
SELECT 字段名 FROM 表名 WHERE 字段名 != 或 <> (xml 内容写法  &gt; &lt; ,!= ,<&lt; ) 查询内容
大于条件查询:
SELECT 字段名 FROM 表名 WHERE 字段名 > (xml 内容写法 &lt;  ) 查询内容
小于条件查询:
SELECT 字段名 FROM 表名 WHERE 字段名 < (xml 内容写法 &gt; ,<  ) 查询内容
大于等于查询:
SELECT 字段名 FROM 表名 WHERE 字段名 >= (xml 内容写法 &lt; =  ) 查询内容
小于等于查询
SELECT 字段名 FROM 表名 WHERE 字段名 >= (xml 内容写法 &gt; =,>=  ) 查询内容
包含条件查询:
SELECT 字段名 FROM 表名 WHERE  字段名 in (查询内容)
不包含条件查询:
SELECT 字段名 FROM 表名 WHERE  字段名 not in (查询内容)
组合条件查询:
SELECT 字段名 FROM 表名 WHERE 字段名=(查询内容)  AND 字段名
模糊匹配查询:
SELECT 字段名 FROM 表名 WHERE 字段名 like '%(查询内容)' 【表示以查询内容结尾的全部数据】
SELECT 字段名 FROM 表名 WHERE 字段名 like '(查询内容)%' 【表示以查询内容开头的全部数据】
SELECT 字段名 FROM 表名 WHERE 字段名 like '%(查询内容)%' 【表示查询有查询内容的全部数据】
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '(查询条件)_(查询条件)_(查询条件)%';
区间条件查询:
SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN 查询条件 AND 查询条件
指定游标是否为null条件查询
SELECT 字段名 is [not] null FROM 表名 WHERE 字段名 = (查询条件)
oracle 运算符
优先级执行顺序
算数运算符[ + , - , * , / ] 连接运算符[ || 可以将两个字符串连接在一起 ]  比较(关系)运算符[ > 大于 ,>= 大于等于 ,< 小于 , <= 小于等于 , != 或 <> 不等于 ,BETWEEN  AND ,IN , like,%,_ ]  逻辑运算符[  AND,  OR, NOT,  ]
查询指定字段的总和
SELECT SUM(字段名) FROM 表名 WHERE 字段名 =(查询条件)
查询指定字段的平均值
SELECT AVG(字段名) FROM 表名 WHERE 字段名 = (查询条件)
查询指定条件表的总数据条数
SELECT COUNT(字段名) FROM 表名 WHERE 字段名 = (查询条件)
sql函数包括如下:
avg函数:计算查询中某一特定字段资料的算术平均值。
count函数:计算符合查询条件的记录数。
min, max函数:传回指定字段之中符合查询条件的第一条、最末条记录的资料。
first, last函数:传回指定字段之中符合查询条件的最小值、最大值。
stdev函数:计算指定字段之中符合查询条件的标准差。
sum函数:计算指定字段之中符合查询条件的资料总和。
var,函数:计算指定字段之中符合查询条件的变异数估计值。
distinct 函数:去字段重复
Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似。base_exp与compare1,compare2等等依次进行比较。如果base_exp和 第i 个compare项匹配,就返回第i 个对应的value 。如果base_exp与任何的compare值都不匹配,则返回default。每个compare值顺次求值,如果发现一个匹配,则剩下的compare值(如果还有的话)就都不再求值。一个为NULL的base_exp被认为和NULL compare值等价。如果需要的话,每一个compare值都被转换成和第一个compare 值相同的数据类型,这个数据类型也是返回值的类型
左连接,右连接,内连接,交叉连接, 完全连接,自然连接 查询:
左连接: 结果包括左表(出现在JOIN子句最左边)中的所有行,不包括右表中的不匹配行。
SELECT a.(字段名),...... b.(字段名),...... FROM 表名 (别名 a) LEFT OUTER JOIN  表名 (别名b) on a.字段名=b.字段名  
右外连接: 结果包括右表(出现在JOIN子句最右边)中的所有行,不包括有左表中的不匹配的行。
SELECT a.(字段名),...... b.(字段名),...... FROM 表名 (别名 a)  RIGHT OUTER JOIN  表名 (别名b) on a.字段名=b.字段名  
内联接: 结果为两个联接表中的匹配行的联接
SELECT a.(字段名),...... b.(字段名),...... FROM 表名 (别名 a)  INNER JOIN  表名 (别名b) on a.字段名=b.字段名  

完全联接:结果包括所有联接中的所有行,不论他们是否匹配。
SELECT a.(字段名),...... b.(字段名),...... FROM 表名 (别名 a)  FULL OUTER JOIN  表名 (别名b) on a.字段名=b.字段名  
交叉联接:结果包括两个联接表中的所有可能的行组合。交叉连接返回的是两个表的笛卡儿积。(Oracle不支持)
SELECT a.(字段名),...... b.(字段名),...... FROM 表名 (别名 a)  CROSS JOIN  表名 (别名b) on a.字段名=b.字段名  
自然连接:在两张表中寻找那些数据类型 和列名都相等的字段,然后自动地将他们连接起来。
SELECT a.(字段名),...... b.(字段名),...... FROM 表名 (别名 a)  NATURAL  JOIN  表名 (别名b) on a.字段名=b.字段名  
比较少见的连接方式
Self joins 自连接:
自连接,可以将自己表的一个镜像作为另一张表来对待,进行连接后查询出数据。
Cartesian Products  笛卡尔积
当两个表没有连接操作时,对这两个表进行查询得到的数据是什么样的呢?是这两个表的笛卡儿积。

多表连接操作

Hash Join(散列连接)、Nested Loops、Sort Merge join,
Hash Join散列连接主要是CBO(CBO: Cost-Based Optimization 基于代价的优化器, Oracle优化器之一,后续会进行介绍)做数据量比较大时进行连接操作比较常用的一种方式,优化器会选用两个表中较小那个表(小一点表或者数据源),利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描大的那个表,同样对JOIN KEY到hash表进行匹配,找出可以匹配的值,此时注意:如果HASH表比较大,无法一次存储到内存时则会分成不多个partition(段),写入磁盘的temporary segment,此时性能会多出一次写的代价,有可能会降低效率。
该内容主要适用于较小的表(可以放入内存),此时相关效能就是访问了两个的性能的成本总和。

SORT MERGE JOIN:排序合并连接

Merge Join排序合并连接,是先将两个关联的表按照关联键(JOIN KEY)进行排序,然后从各自排序表中抽取数据,到另一个排序表中进行匹配。
相对来说,merge join需要完成排序操作,所以消耗的性能比较多,但是当源如果已经进行了排序,其将会取得较好的性能。适用于:不等价关联(>,<,>=,<=,<>)、HASH_JOIN_ENABLED=false等情况。

NESTED LOOP:嵌套循环连接

Nested Loops嵌套循环连接,工作方式是循环从一张表中读取数据(驱动表 outer table),然后访问另一张表(被查找表 inner table, 希望有索引)。驱动表中每一行与inner表中相应记录进行链接(JOIN)。内表被外表驱动,外表中的每一行都会与内表进行匹配操作,所以查询结果集最好不要太大。将数据量小的表作为查询的驱动表(外表),可以利用ordered 来提示CBO默认的驱动表。
分页,分组,排序
分页: (注意 rownum 不能直接写在WHERE条件里否则只能大不能小)
SELECT rownum as rn,(字段名) FROM (表名)  WHERE rn < (分页参数) and rn > (分页参数)
分组: GROUP BY
SELECT (字段名) FROM (表名)WHERE (字段名)like(查询条件)GROUP BY (字段名)
排序: ORDER BY 升序 ASC默认 ,降序 DESC 
SELECT (字段名) FROM (表名)WHERE (字段名)like(查询条件)GROUP BY (字段名)ORDER(字段名),(字段名) desc
union 和union all 
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
SELECT (字段名)FROM (表名) WHERE  (字段名)> (查询条件)union  SELECT (字段名)FROM (表名) WHERE  (字段名)>(查询条件)and ( 字段名)<(查询条件)
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
SELECT (字段名)FROM (表名) WHERE  (字段名)> (查询条件)union all  SELECT (字段名)FROM (表名) WHERE  (字段名)>(查询条件)and ( 字段名)<(查询条件)
Oracle 的存储过程和数据库事务 
CREATE OR REPLACE PROCEDURE  存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
自主事务:是由零一个事务启动的独立事务处理。自主事务处理可以暂停主事务处理,也就是处理自己存储过程内部的事务,当自主事务处理完之后会恢复主事务处理。
PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其他事务提交,回滚的影响
--自主事务:带参数添加部门信息,最后使用了回滚CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD(DEPTNO NUMBER,DNAME VARCHAR2,LOC VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION; --定义为自主事务,不受其他事务提交,回滚影响BEGIN
INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (DEPTNO, DNAME, LOC);
ROLLBACK; --自主事务回滚操作,不影响主事务。END;
--主事务,添加部门信息,并调用带参数的自主事务,自己本身提交CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD2 ASBEGIN
INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES ( 60, 'test1', 'test2');
PRO_DEPT_ADD( 70, 'test', 'test'); --如果调用的事务回滚,如果不是自主事务当前存储过程中插入数据也要一起回滚。但是添加了自主事务后,自主事务提交内容不会影响到当前存储过程
COMMIT;
END;
BEGIN
pro_dept_add2(); --调用完毕后,为60的部门插入成功,但是为70的部门信息回滚了。只有一条插入成功!END;
  1、自主事务处理结果的变化不依赖于主事务处理的状态或最终配置。
  2、自主事务处理提交或回滚时,不影响主事务处理的结果。
  3、自主事务提交一旦提交,该自主事务处理结果的变化对于其他事务处理就是课件的。这意味着,用于可以访问已更新的信息,无需等待主事务处理提交。
  4、自主事务处理可以启动其它自主事务处理。
Oracle数据库的逻辑语法
条件判断
1.case......when......then.......else......end:
SELECT  CASE  WHEN t.(字段名) = 1 THEN '输出结果' ELSE WHEN t.(字段名) = 2  THEN '输出结果' ELSE '输出结果' END (别名) FROM 表名 t
2. decode() 函数:
SELECT DECODE(字段名,值1,输出结果1,值2,输出结果,......值n,输出结果n,缺省值) FROM 表名 
3,if......then......end if  :( 在存储过程中使用)
if 字段名= '1' then '输出结果'end if;
if 字段名= '1' then '输出结果' else '输出结果' end if;
if 字段名 = '1' then '输出结果' elsif 字段名 = '2' then '输出结果' else '输出结果' end if;
循环语句
loop语句: 会先执行一次循环体,然后在判断“exit when”关键字后面的条件表达的值是true还是false,如果是true,则程序会退出循环体,否则程序将再次执行循环体,这样就使得程序至少能够执行一次循环体。
案例:
declare
sum_i int:=0;         --定义整型变量,存储整数和
i int:=0;             --定义整数变量,存储自然数
begin
loop                  
i:=i+1;             --循环累加自然数
sum_i:=sum_i+i;     --得出自然数
exit when i=100;    --当循环100次时,程序退出循环体
end loop;
dbms_output.put_line('前100个自然数的和是:'||sum_i);
end;
while语句:根据它的条件表达式的值执行零次或多次循环体,在每次执行循环体之前,首先要判断条件表达式的值是否为true,若为true,则程序执行循环体;否则退出while循环,然后继续执行while语句后面的其他代码。
案例:
declare
sum_i int:=0;         --定义整型变量,存储整数和
i int:=0;             --定义整数变量,存储自然数
begin
while i<=99 loop      --当i的值等于100时,程序退出while循环
i:=i+1;             --得出自然数
sum_i:=sum_i+i;     --计算前n个自然数的和
end loop;
dbms_output.put_line('前100个自然数的和是:'||sum_i);
end;
for语句: 一个可以预置循环次数的循环控制语句,它有一个循环计数器,通常是一个整型变量,通过这个循环计数器来控制循环执行的次数。
案例:
declare
sum_i int:=0;              --定义整型变量,存储整数和
begin
for i in reverse 1..100    --遍历前100个自然数
loop
if mod(i,2)=0 then       --判断是否为偶数
sum_i:=sum_i+i;        --计算偶数和
end if;
end loop;
dbms_output.put_line('前100个自然数中偶数之和是:'||sum_i);
end;
Oracle 数据库的锁

用户和系统:

自动锁(automatic locks):
系统自动为此数据库操作获得所有有必要的锁。
自动锁分为三种:
DML 锁
DDL 锁
systemlocks。
显示锁(manual Data locks):

需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。

锁级别:

排他锁(exclusive lock):
事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
共享锁(share lock):
共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。
共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。

操作锁:

DML锁:
锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性。 主要用于保护并发情况下的数据完整性 DML 语句能够自动地获得所需的表级(TM)与行级(事务)锁(TX)。
加锁方式:
共享锁方式( SHARE)
独占锁方式( EXCLUSIVE)
共享更新锁( SHARE UPDATE) 
其中: 
SHARE, EXCLUSIVE 用于 TM 锁(表级锁) 
SHARE UPDATE 用于 TX 锁( 行级锁)
DLL锁:  
锁用于保护数据库对象的结构,如表、索引等的结构定义。
可以分为:
排它 DDL 锁、
共享 DDL 锁、
分析锁
System Locks:
Latch属于 System Lock, 用于保护 SGA区中共享数据结构的一种串行化锁定机制。
Latch 的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch、需要等待多长时间有关.
Latch 是 Oracle 提供的轻量级锁资源, 是一种能够极快地被获取和释放的锁,能快速,短时间的锁定资源,
Latch用于防止多个并发进程同时修改访问某个共享资源, 它只工作在 SGA 中, 通常用于保护描述 buffer cache 中 block 的数据结构。
比如 SGA 中,各种数据被反复从磁盘读取到内存,又被重新写回到磁盘上,如果有并发的用户做相同的事情, Oracle 必须使用一种机制,来保证数据在读取的时候,只能由一个会话来完成,这种保护机制就是 Latch。
  • 并发( concurrency): 是说有超过两个以上的用户对同样的数据做修改(可能包括插入,删除和修改)。
  • 并行( parallel): 是说将一件事情分成很多小部分,让每一部分同时执行,最后将执行结果汇总成最终结果。
与每个 latch 相联系的还有一个清除过程,当持有 latch 的进程成为死进程时,该清除过程就会被调用。
Latch 还具有相关级别,用于防止死锁,一旦一个进程在某个级别上得到一个 latch,它就不可能再获得等同或低于该级别的 latch。
Latch 不会造成阻塞,只会导致等待。 阻塞是一种系统设计上的问题,等待是一种系统资源争用的问题。
latch和lock
Latch 是内存中的资源锁,数据库对象(表,索引等)的锁叫Lock。
Latch 和 Lock 的区别:
( 1) . Latch 是对内存数据结构提供互斥访问的一种机制,而 Lock 是以不同的模式来套取共享资源对象,各个模式间存在着兼容或排斥,从这点看出, Latch的访问,包括查询也是互斥的,任何时候,只能有一个进程能 spin 住内存的某一块,幸好这个过程是相当的短暂,否则系统性能将没的保障,从 9I 开始,允许多个进程同时查询相同的内存块。
( 2) . Latch 只作用于内存中,他只能被当前实例访问,而 Lock 作用于数据库对象,在 RAC 体系中实例间允许 Lock 检测与访问
( 3) . Latch 是瞬间的占用,释放, Lock 的释放需要等到事务正确的结束,他占用的时间长短由事务大小决定
( 4) . Latch 是非入队的,而 Lock 是入队的
( 5) . Latch 不存在死锁,而 Lock 中存在。
Oracle 数据索引:
索引是一种和表有关的数据结构,它可以使查询的sql语句执行的更快。其实索引就如同图书的目录,我们可以根据目录中的页码快速的找到所需的内容。
索引分类
Ø  按存储方法分类
b-tree树索引: b-tree树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。
 
位图索引:位置索引储存在主要用来节省空间,减少Oracle对数据块的访问,它采用位图偏移方式来与表的行ID对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,Oracle每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。
 
Ø  按功能分类
唯一索引:唯一索引有两个作用,一个是数据约束,一个是数据索引。其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。
主关键字索引:主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。
一般索引:一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。
 
Ø  按索引对象分类
单列索引(表单个字段的索引)
多列索引(表多个字段的索引)
函数索引(对字段进行函数运算的索引)
1)位图索引(bitmap index)
  假设数据库表中有一列其选择性非常窄,例如性别列,该用什么类型的索引?你可能会考虑对其使用位图索引。因为位图索引正是为相异值很少的列而创建的。但需要考虑的因素还不只这些。一般而言,只有当你对表中值相宜度较小的多个不同的列都使用位图索引,这样位图索引才有用,因为你可以一起使用这些索引才能对列产生更大的选择性,否则你还是需要对这些列进行一次全表扫描。例如,对于性别列,其索引只能有两个唯一值,那么用这个索引对表的任何搜索有可能都返回一半的记录。其次,这些索引是为数据仓库而设计的,所以其假定条件是数据不会发生很大的改变。这些索引不能用来满足事务数据库或更新频繁的数据库。应该说,对位图索引的表进行更新根本没有一点效率。
  2)位图连接索引(bitmap join index)
  位图连接索引比位图索引更进了一步。这些索引将位图化的列完全从表数据中抽取出来,并将其存储在索引中。其假定条件是这些列集合必须一起查询。同样的,这也是为数据仓库数据库而设计的。除了在句法最后有一个WHERE子句之外,位图连接索引的创建指令就像创建位图索引的CREATE BITMAP INDEX一样。
  3)压缩索引
  压缩索引实际是标准b-tree索引的一个选项。压缩索引的叶节点更少,所以总的I/O数量和需要的缓存也更少。这些都意味着Oracle的优化器更可能使用这些压缩索引,而不倾向于使用标准的非压缩索引。不过,这些好处也是有代价的,当你对这些压缩索引进行存取操作时,要消耗更多的CPU来进行解压缩。而且,当你阅读关于优化器如何使用这些索引,又是如何选择合适的压缩级别的资料时,就开始变得晦涩了。不同的用户不同的设置从压缩索引中得到的好处也可能会有所不同。
 4)降序索引(descending index)
  这是基于函数索引的一种特殊类型。降序索引可以显著优化ORDER BY x, y, z DESC子句查询的。
  5)分区索引(partitioned index)
  如果你的数据库中有一个分区表,你就有机会体验几种新的索引类型,从贯穿所有分区的全局分区索引(global)和集中于各个单独分区的本地分区索引(local)。这里不再进行赘述,想知道细节问题可以查询相关文献。
  6)索引组织表(index organized table,IOT)
  这是在Oracle 9i中引进的一种新类型表。Oracle会将级联索引及其扩展类型的索引用于表中所有的列。当所有数据都载入到索引结构之后,表就成多余的了,你尽可以将表本身删除掉。这就是索引组织表。
  7)簇索引(cluster index)
  基本上,簇索引就是将多个表的相同列放在一起,而对该列使用用一个簇索引。这种索引在实际应用中比较少,因为还有各种有待解决的性能问题存在。
  8)域索引(domain index)
  当我们创建为用户自定义数据类型(datatype)创建用户自定义索引类型(indextype)时就要使用域索引。
  9)隐藏索引(invisible index)
  这是Oracle 11g中推出的新特性。其创建过程和标准索引一样,但创建后对于基于代价的优化器(CBO)是不可见的。这可以让你对性能进行大型测试查询,而不会影响现有的正在运行的应用程序。
  10)虚拟索引(virtual index)
  这是为测试人员和开发人员准备的又一个工具。虚拟索引(不分配段空间)可以让你在不需要实际创建索引的情况下,测试新索引及其对查询计划的影响。对于GB级的表来说,构建索引非常耗费资源而且还要占用大量时间。
  11)其他的索引类型
  Oracle数据库还提供了很多其他类型的索引,例如用来为字符型大型二进制对象(CLOB)或其他大型文本数据构建索引的Oracle TEXT,Oracle Spatial等。有兴趣的读者可以自己查找相关资料了解。
 
Ø  数据库的索引分为:聚集索引,非聚集索引,唯一索引。
 
2.      索引优点
 
优点:方便了查询,在数据量大时排序更易查询
 
3.      索引缺点
 
缺点:查询时需要进行重新排序,减少了效率。
物理索引缺点:建立索引效率低,只能建一个
 
4.      索引作用
 
为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。
第一,通过创建唯一性索引,可以保证Oracle数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显着减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
 
5.      增加索引分析
 
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。
增加索引也有许多不利的一个方面:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
6.      索引应用场合
  索引是建立在Oracle数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速度;
  在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
  在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
  同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。

Oracle数据库笔记总汇相关推荐

  1. 达内oracle教材,达内学习心得oracle数据库笔记

    达内学习心得oracle数据库笔记 达内学员: oracle 数据库笔记获奖学员:王梓祺所获奖项:三等奖内容:/*前言:这份资料是结合老师笔记,课堂案例, TTS6.0 课件以及个人的理解整理,时间仓 ...

  2. Oracle数据库笔记(基于oracle数据库的PLSQL编程以及存储过程的创建和使用)

    PLSQL编程 概念和目的 程序结构 Hello World 变量普通变量 引用型变量 记录型变量 流程控制 条件分支 循环 游标 什么是游标 语法 游标的属性 创建和使用 带参数的游标 存储过程 概 ...

  3. Oracle数据库•笔记

    Oracle数据库•笔记 第一章 数据库概述 第二章 表管理.表数据库修改 oracle注释:单行注释(–),如: –这是单行注释 多行注释(/**/),如: /* 这是多行注释 这是多行注释 这是多 ...

  4. oracle rownum union,oracle数据库笔记

    获奖学员:王梓祺 所获奖项:三等奖 内容: /*前言:这份资料是结合老师笔记,课堂案例,TTS6.0课件以及个人的理解整理,时间仓促,如有纰漏敬请原谅.*/ Oracle 数据库 语法顺序 selec ...

  5. oracle11g之管理oracle数据库笔记(理论基础知识)

                                                                  第三章 管理oracle数据库 1.启动数据库步骤;(创建启动实例--> ...

  6. oracle数据库笔记---oracleweb视图使用流程,及plsql安装

    1.   a.第一次进入的时候输入:http://127.0.0.1:1158/em/     Oracle Enterprise Manager注意,网页的标题是这个;     输入:system账 ...

  7. Oracle数据库笔记以及plsql的使用

    1.登录sys 1.sql*plus登录 请输入用户名: connect / as sysdba 输入口令:oracle 连接到: Oracle Database 11g Enterprise Edi ...

  8. Oracle数据库笔记

    一. 1.创建表空间的语法 create tablespace 表空间名称​datafile 文件名 size 初始大小 [reuse][autoextend[off|on[next 增长量][ma ...

  9. oracle数据库----笔记1----oracle数据类型

    char(size):存放定长字符型数据最长255个字符,缺省size为1. varchar2(size):存放可变长字符串数据, size 最长为2000字符(或4000字符) number(n,d ...

最新文章

  1. mysql加删查语句_MySQL基本语句——增、删、查、改
  2. Scaleform GFx
  3. Ubuntu16.04上安装kitti2bag
  4. 网络知识:电脑无线网连接不上问题汇总!
  5. Java里try catch的简单用法
  6. Mysql允许root用户远程访问
  7. Qt file not recognized: File truncated 半分钟搞定,不用浪费过多时间重新编译
  8. 模电数电c语言笔试题,模电数电题面试题集锦
  9. 面试字节跳动,我被怼了....
  10. FIR滤波器的FPGA实现方法
  11. 缓解眼睛疲劳:按摩+复调钢琴曲
  12. 动态规划---石子游戏
  13. 新技术加速隐私暴露,我们该怎么办?(二)
  14. js jquery 获取元素(父节点,子节点,兄弟节点),元素筛选
  15. python基础编程(Ⅲ)
  16. MySQL备份恢复练习
  17. Vue之监测数据的原理
  18. Linux Note [vaynexiao]
  19. c++i/o系统 纯。
  20. JAVA中同目录下定义类,以及对象的创建与使用,内存图的原理

热门文章

  1. Python爬虫工程师的前景、薪资详细介绍
  2. Notes of CFA Level1 READING 8:STATISTICAL CONCEPTS AND MARKET RETURNS
  3. tars-php文档,tarsphp的安装使用
  4. python yield 惰性计算,用于scrapy中(美食杰爬虫为例)
  5. Java开发中解析word文档录入数据库——后续
  6. 陌陌推出“新年照相馆” 新民俗营造线上春节氛围
  7. 【机器学习项目实战】数据相关岗位薪资水平影响因素研究分析
  8. 数学之美--金色对角线
  9. 入门程序设计,一篇就够
  10. css实现网页全屏显示