19-1-Oracle常考

文章目录
  1. 1. Oracle常考
    1. 1.1. 索引
    2. 1.2.
      1. 1.2.1. 解释什么是死锁,如何解决Oracle中的死锁?
    3. 1.3. 分区分表
    4. 1.4. 分页
      1. 1.4.1. rowid与row num区别
    5. 1.5. ACID
    6. 1.6. 范式
    7. 1.7. 并发事务问题
    8. 1.8. 隔离级别
    9. 1.9. 常用名词
    10. 1.10. 最左匹配原则
    11. 1.11. explain plan for查看执行计划
    12. 1.12. mysql与oracle区别
    13. 1.13. 主键有几种?
    14. 1.14. truncate和delete区别
    15. 1.15. SQL语句分类

Oracle常考

索引

\1. b-tree索引
Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE
INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。
\2. 位图索引(bitmap index)
位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。
\3. 基于函数的索引
比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。
\4. 分区索引和全局索引
这2个是用于分区表的时候。前者是分区内索引,后者是全表索引
\5. 反向索引(REVERSE)
这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值
(10001,10002,10033,10005,10016..)
这种情况默认索引分布过于密集,不能利用好服务器的并行
但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。
6.HASH索引
HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。集群键上不同值的数目必须在创建HASH集群之前就要知道。需要在创建HASH集群的时候指定这个值。使用HASH索引必须要使用HASH集群。

创建标准索引:
CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建组合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名;
创建反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;

  1. 行共享锁 (ROW SHARE)

  2. 行排他锁(ROW EXCLUSIVE)

  3. 共享锁(SHARE)

  4. 共享行排他锁(SHARE ROW EXCLUSIVE)

  5. 排他锁(EXCLUSIVE)
    使用方法:
    SELECT * FROM order_master WHERE vencode=”V002”
    FOR UPDATE WAIT 5;
    LOCK TABLE order_master IN SHARE MODE;
    LOCK TABLE itemfile IN EXCLUSIVE MODE NOWAIT;
    ORACLE锁具体分为以下几类:
    1.按用户与系统划分,可以分为自动锁与显示锁
    自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。
    显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
    2 . 按锁级别划分,可分为共享锁与排它锁
    共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。
    排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
    3.按操作划分,可分为DML锁、DDL锁
    DML锁又可以分为,行锁、表锁、死锁
    行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。
    表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。
    死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。
    如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务; 1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。

  6. 死锁一般是因拙劣的事务设计而产生。死锁只能使用SQL下:alter system kill session “sid,serial#”;或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者使用其它工具杀掉死锁进程。
    DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁
    排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。
    共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。
    如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。
    分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。
    4.内部闩锁
    内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。

解释什么是死锁,如何解决Oracle中的死锁?

简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行

解决办法:
1). 查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;

select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;

2). 杀进程中的会话

alter system kill session “sid,serial#”;

分区分表

Oracle的分区可以分为:列表分区、范围分区、散列分区、复合分区。
1). 增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;
2). 减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,可能比整个大表修复花的时间更少;
3). 维护轻松:如果需要得建表,独产管理每个公区比管理单个大表要轻松得多;
4). 均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;
5). 改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快
6). 分区对用户透明,最终用户感觉不到分区的存在。

分页

Oracle中使用rownum来进行分页, 这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10

Oracle用rownum进行分页

分页语句的步骤:

a.最内层sql,查询要分页的所有数据

b.第二层sql,通过rownum伪列确定显示数据的上限,并且给查询的数据添加rownum伪列的值

c.最外层sql,设置显示数据的下限

select*from

(select a.*,rownum r from

(select*from表名 where条件 orderby列) a

where rownum<=页数条数) b where r>(页数-1)条数

rowid与row num区别

  1. rowid和rownum都是虚列
  2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置
  3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别。

ACID

1)原子性(Atomic):事务中的各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败

2)一致性(Consistent):事务结束后系统状态是一样的

3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态

4)持久性(Durable):事务完成后,即使发生灾难性的故障,通过日志和同步备份可以在故障发生后重建数据

范式

1)第一范式:原子件,要求每一列的值不能再拆分了

2)第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)

3)第三范式:所有列与主键直接相关

并发事务问题

脏读(读到未提交),不可重复读,幻读(记录增多或赠少)

隔离级别

读未提交,都提交,可重复度,串行化

常用名词

  1. 索引回表
  2. 索引覆盖
  3. 索引下推(过滤了要找的索引再回表,而不是回表再过滤,减少回表)

最左匹配原则

  1. =才会往右走,遇到《》就会停下。会优化顺序的。例如(a,b,c)->a=1,c>0,b=2会走全部的。
  2. like最左不要%
  3. 不要在列上运算
  4. 不使用not in和<>。in走索引
  5. 自增主键最好

explain plan for查看执行计划

mysql与oracle区别

主键有几种?

复合型、整数型、字符型

truncate和delete区别

1)Truncate 是DDL 语句,DELETE 是DML语句。

2) Truncate 的速度远快于DELETE;

原因是: 当执行DELETE操作时所有表数据先被COPY到回滚表空间,数据量不同花费时间长短不一。而TRUNCATE 是直接删除数据不进回滚表空间。

3) delete 数据可以运行Rollback 进行数据回滚。而Truncate 则是永久删除不能回滚。

  1. Truncate 操作不会触发表上的delete触发器,而delete 会正常触发。

5) Truncate 语句不能带where 条件意味着只能全部数据删除,而DELETE可带where 条件进行删除数据。

6) Truncate 操作会重置表的高水位线(High Water Mark),而delete 不会。Truncate不能对视图进行操作,delete操作不会腾出表空间的内存

SQL语句分类

DQL(数据查询语言)select

DML(数据操作语言)insert、delete、update

DDL(数据定义语言)create、drop、alter

DCL(数据控制语言)grant:把权限授予用户、revoke:把权限从用户收回

TPL(TCL,事务控制语言):commit、rollback