本次内容的相关知识点我们在学习sqlserver2008R2的时候介绍过一些,包括:事务、索引、视图等。那么今天我们学习在oracle上实现这些重要的内容,以实现数据库的优化。 1、简介 事务是数据处理的核心,是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。DBMS通过事务的管理来协调用户的并发行为,减少用户访问资源的冲突。 1)显示提交:当事务遇到COMMIT指令时,将结束事务并永久保存所有的更改的数据。 2)显示回滚:当事务遇到ROLLBACK指令时,也将结束事务的执行,但是此时它回滚所有更改的数据到事务开始时的原始值,即取消更改,数据没有变化。 3)DDL语句:一旦用户执行了DDL(数据定义语言,如create,drop等)语句,则之前的所有DML(数据操作语言)操作作为一个事务提交,这种提交称为隐示提交。 4)正常结束程序:如果oracle数据库应用程序正常结束,如使用sqlplus工具更改了数据,而正常退出该程序(exit),则oracle自动提交事务。 5)非正常地结束程序:当程序崩溃或意外终止时,所有数据更改都被回滚,这种回滚成为隐示回滚。 2、事务的特点 事务有4个特性,简写为ACID特性。 1)原则性:以转账操作为例,转出账户余额减少和转入余额增加是两个DML语句,但是必须作为一个不可分割的完整操作。要么同时成功,要么同时失败,只转出而没有转入显然是不可接受的。 2)一致性:无论是在事务前、事务中、事务后,数据库始终处于一致的状态。例如:转账前分别是2000和1000,总金额是3000,转账300后分别是1700和1300,总金额还是3000.这就叫做一致性。不一致就是在某个时间点查询到的总金额不是3000。 3)隔离性:在某个时间段,肯定有很多人都在转账,每个人的转账都是在自己的事务中,所以在一个数据库中,会有很多事物同时存在。虽然同时存在很多事物,但是事物之间不会相互影响。 4)持久性:如果事物提交成功,则数据修改永远生效,如果是回滚,则数据完全没有没修改,就相当于没有这件事情发生。 3、学会事物的控制 1)使用COMMIT和ROLLBACK实现事物控制 COMMIT:提交事物,把事物中对数据库的修改进行永久保存。 ROLLBACK:回滚事物,取消对数据库所做的任何修改。 2)使用AUTOCOMMIT实现事物的自动提交 Orade提供了一种自动提交DML操作的方式,这样一旦用户执行了DML操作,如UPDATE,DELETE等,数据就会自动提交。 例2:使用autocommit实现事物自动提交,设置autocommit为ON 3)验证持久性 一旦使用commit命令来结束某个事务,那么就必须保证数据库不丢失这个事务。在事务进行期间,隔离性的原则要求除了指定会话涉及的用户之外的任何用户都不能查看当前所做的变化。不过事务一旦完成,所有用户都必须能够立即看到所做的变化,同时数据库必须保证这些变化绝不会丢失。Oracle通过使用日志文件来满足这个需求。日志文件具有两种形式:联机重做日志文件,归档重做日志文件。 一个正确配置的oracle数据库是不可能丢失数据的。当然用户的错误(包括不恰当的DML或删除对象)也会造成数据的丢失。DDL语句有自动提交功能(create、drop、truncate、alter) 关于事物的总结: 需要注意的是,Commit:只是用来确认这个数据已经正式的修改了,不一定非得写入硬盘,DBWn什么都不做。执行commit命令时发生的所有物理操作时LGWR进程将日志缓冲区的内容写入磁盘。DBWN进程完全没有执行任何操作。DBWN进程与提交事物处理没有关系,不过最终DBWN进程会将变化的数据块写入磁盘。 commit和rollback语句只应于DML语句,我们无法回滚DDL语句。DDL语句一旦被执行就会立即具有持久状态。 1、索引的含义 Oracle 数据库对象又称模式对象,数据库对象是逻辑结构的集合,最基本的数据库对象是表,索引也是其中之一。其他数据库对象包括: 索引是oracle的一个对象,是与表关联的可选结构,提供了一种快速访问数据的途径,提高了数据库检索性能。索引使数据库程序无需对整个表进行扫描,就可以在其中找到所需要的数据。就像书的目录,可以通过目录快速查找所需信息,无需阅读整本书。 2、索引的特点 适当地使用索引可以提高查询速度 可以对表的一列或多列建立索引 建立索引的数量没有限制 索引需要磁盘存储,可以指定表空间,由oracle自动维护 索引对用户透明,检索时是否使用索引由oracle自身决定 Oracle数据库管理系统在访问数据时使用以下三种方式: 全表扫描 通过ROWID(行地址,快速访问表的一行) 使用索引 当没有索引或者不选择使用索引时就用全表扫描的方式 3、索引的分类 1)B树索引结构 索引的顶部为根,其中包含指向下一级索引的项。下一级为分支块,分支块又指向索引中下一级的块,最低一级的块称为叶节点,其中包含指向表数据行的索引项。叶节点为双向连接,有助于按关键字值得升序和降序扫描索引。 例如:查询id从2到31行的数据 上图中使用索引遍历过程如下: 先找到id<=50的分支块,再找到30-40的分支块,在找到id=31对应的索引项,之后通过叶节点双向链接,平行地找到包含id=2的索引块,完成对id的查询 4、创建索引的语法 create [unique] index 索引名称 on 表名(列名)[tablespace 表空间名称] 解释: [unique]用于指定唯一索引,默认情况下为非唯一索引 [tablespace]为索引指定表空间 1)创建标准索引 SQL> CREATE INDEX index_name ON tablename(columnname) TABLESPACE index_tbs; 2)重建索引 SQL> ALTER INDEX index_name REBUILD; 合并索引碎片 SQL>ALTER INDEX index_name COALESCE; 3)删除索引 SQL> DROP INDEX index_name; 1、概述 视图是一个虚表,不占用物理空间,因为视图本身的定义语句存储在数据字典里,视图中的数据是一个或多个实际表中获得的。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。 2、视图的优点: 1)提供了另外一种级别的表安全性 2)隐藏的数据的复杂性:一个视图可能是用多表连接定义的,但用户不需要知道多表连接的语句也可以查询数据。 3)简化的用户的SQL命令:查询视图的时候不需要写出复杂的查询语句,只需要查询视图名称即可。 4)隔离基表结构的改变:视图创建好了之后,如果修改了表的结构,也不会影响视图的。 5)通过重命名列,从另一个角度提供数据:例如在销售系统中,每日下班前要对当日数据进行汇总,在销售人员眼中,该汇总表成为日销售统计表,在财务人眼中,该销售表成为销售日报表。 3、创建视图的语法: 1) CREATE [OR REPLACE] [FORCE] VIEW view_name [(alias[, alias]...)] AS select_statement [WITH CHECK OPTION] [WITH READ ONLY]; 解释: OR REPLACE:如果视图已存在,此选项将重新创建该视图。 FORCE:如果使用此关键字,则无论基表是否存在,都将创建视图。 NOFORCE:这是默认值,如果使用此关键字,则仅当基表存在时才创建视图。 VIEW_NAME:要创建视图的名称 Alias:指定由视图的查询所选择的表达式或列的别名。别名的数目必须与视图所选择的表达式的数目相匹配。 Select_statement:select语句 WITH CHECK OPTION :此选项指定只能插入或更新视图可以访问的行。术语constraint表示为CHECK OPTION约束指定的名称。 WITH READ ONLY:此选项保证不能在此视图上执行任何修改操作。 2)视图中的ORDER BY子句 可以在创建视图时在SELECT语句中使用ORDER BY子句,以便按照特定的顺序进行排序,这样,在查询视图时即使不使用ORDER BY子句,结果集也会按指定的顺序进行排列。 3)创建带有错误的视图 如果在create view语句中使用FORCE选项,即使存在系列情况,oracle也会创建视图。 视图定义的查询引用了一个不存在的表。 视图定义的查询引用了现有表中无效的列。 视图的所有者没有所需的权限。 在这些情况下,oracle仅检查create view语句中的语法错误。如果语法正确,将会创建视图,并将视图的定义存在数据字典中。但是,该视图却不能使用。这种视图被认为是“带错误创建”的。可使用SHOW ERRORS VIEW视图名来查看错误。一、事务
二、索引
三、视图