Oracle面试问题汇总

1:SqL 优化

◆查找Oracle中不合理的sql语句,对其进行优。1:尽量避免使用 select * 查询方式

 因为oracle 在解析过程中 会将*依次转化成所以的列名。

2:减小访问数据库的次数

因为每执行一条sql语句的时候,oracle内部会做许多的事情 如:解析sql ,估算索引的利用效率,绑定变量,读数据块等。因此减小了访问数据库的次

数实际就是减小了oracle的工作量

3:用where前条件查询来代替having后条件查询

因为使用having后条件查询的话,会检索出所以记录之后,才对结果集进行过滤 而使用where前条件查询的话 它首先会通过条件限制了记录的数目,这样减小了开销

4:尽量使用exists代替in 用 not exists 代替 not in

因为在相关子查询中 我们使用 in  或者 not in 的话,它会执行内部的排序与合并

如 查询一条in(1,2,3,1);它会对这里面的数据进行排序

 无论是那种情况in 或者 not in 是相当的低效的 因为 它还有对子查询相关联的表进行全表遍历,我们可以把in  notin 改成exists 或 notExists

如下面的sql语句:

select * from emp where deptno in (select deptno fromdept where dnmae="jong")select * from emp where exists(select 1 from dept where emp.deptno =deptno anddname = 'jong')

5:用Exists代替distinct

因为在相关子查询中distinct 把结果集查出来,内部,还会查找 重复的结果集6:应该用union代替or

select * from emp where empid = 'df' or empid ='1002' 而union会将两个结果集进行合并

8:用rowid来删除重复记录数

所用的字段都是相同的,只有rowid不是重复的,所以要删除重复记录时,我们 充分利用rowid来删除重复记录9:使用DECODE函数来减少处理时间

使用DECODE函数来减少处理时间 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 10:用TRUNCATE替代DELETE来删除数据

11:使用表的别名12:尽量多使用COMMIT

 因为comit会释放资源13:用>=替代>

14:sql语句大写,因为oracle解析sql语句的时候,会将小写转化成大写

15:表的驱动方式也会关系的 sql优化 不同的驱动方式,结果不一样

◆对Oracle中访问量频繁的表,除合理建索引外,再就是把这些表分表空间存放以免访问上产生热点,再有就是对表合理分区。

16:用索引来提高效率

因为索引就相当于书的目录 如果我们看一本书,如果我们要查找相关联的内容,我们就可以通过书的目录快速的定位到多少页来查看书的内容

当然我们在使用索引时要注意以下问题:

a:不能在索引列上使用远算:包括算术远算,逻辑远算 这样是相当的消耗性能的

 

b:避免在索引列上使用NOT:

通常,我们要避免在索引列上使用NOT,NOT会产生在和在索引列上使用函数相同的影响。当ORACLE遇到NOT,他就会停止使用索引转而执行全表扫描。

17: 表分区,当一个表的业务数据量很大的时候,比如说,中国移动的用户信息表,当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都全表扫描。

 

2:根据项目中的业务讲一下你使用的存储过程

例如前台界面是“结算操作”业务,根据输入了的结算时间段和结算单位,购买额数,以及相关的控制参数 把这些参数传给后台存储过程,后台存储过程里面可以编制相关的结算处理程序,根据输入的单位、时间、份额等参数,来进行集中处理,这个过程是不需要与前台进行交互的,这里可以处理很复杂的业务,例如结算操作会涉及到多个表如单位基本信息表、单位结算信息表、明细表等等,这个是在存储过程里面集中实现处理,然后把结果返回给前台,前台根据处理结果是否成功,决定是否进行提交(COMMIT)操作。

 

3:oracle自动增长如何实现

 

oracle不像Mysql样创建主键的时候可以手动设置它的主键为自动增长型,而oracle需要通过
序列来生成主键,创建一个序列一般 包括:最小值,初始值,步长,和最大值 
4:sql执行原理
user写一条sql,将会对这条sq进行 解析,在解析的过程中,首先会对语法进行分析 ,分析语句的语法是否符合规范,是否正确 然后进行对语义进行分析 检测sql中涉及到的数据库对象是否存在 分析过后,再选择相应的优化器,不同的优化器 执行的效率不同 同时生成的 计划也不同 如果选择 技入规则优化器:oracle默认执行的是计入规则优化器,是从右往左 从下到上执行 
如:selelct * from A,B 那么 oracle 会是从右至左查询,先查询B表,再查询A表。再如果牵涉到相关子查询,它会默认从下往上执行,也就是先从
最里面sql语句一路往外执行。如果选择的是 计入成本优化器:统计表的数据 计算出使用不同计划的成本 并选择成本最低的一个计划
最后远行执行计划。返回结果集
5:oracle 乐观锁 与 悲观锁 
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。            并发量大 ,控制好锁 ,保证事务的一致性。 锁会影响程序的并发性,与效率 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。
例:在并发的时候,两个用户同时访问同一条sql的时候 比如说 A 用户updatte一条数据的时候,把10更新成20的时候,把commit  利用锁机锁住而
B用户在同时select 这条数据的时候,为10
注:select的时候,获得锁,update的时候, 独立锁
6:数据库表的设计原则
根据数据库3大范式来设计 建的过程中,通过e_r模型  首先把实体找出来,如 建立一个学生管理系统:会根据业务需求和实际情况与团队的讨论,来建立 表,学生表,teacher表,班级,年纪表,呀,课程表,把一个实体建立成一个表 再找出实体与实体之间的关系,比如说一个班级有多个学生呀  属于 一对多  一个学生可以选修了多们课程,一们课程可以有多个学生来选修 这样的关系属于
多对多的关系,等  这样大致的框架出来了,再根据实际情况来设置实体的属性,如:一个学生表肯定拥有以下字段 主键 id 姓名,年龄等属性当然在设计的过程中一定要满足数据库3大范式
7:删除重复除了用 DISTINCT 还 用 什么? 同时写出 性能最好的 删除 重复 sql语句?
rowid .
delete from employee e2 where rowid <(

        select max(e1.rowidfrom employee e1 where         e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

                  e1.salary=e2.salary);

 

8:oracle 分页?

SELECT * FROM (

SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A 

WHEREROWNUM<=40

)

WHERE RN >= 21

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

SELECT * FROM 

(

SELECTA.*,ROWNUMRN

FROM(SELECT*FROMTABLE_NAME)A

)

WHERE RN BETWEEN 21 AND 40

9:oracle rowid  与 rowNum 的区别?

rownum是行数,ROWID是物理编号  

通过唯一rowid实现删除重复记录.在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的

10:oracle 的内置函数?

1:oracle 提供一些内置函数 用于sql的结构化查询 语句 

sql的结构查询语句分为:1:dml语句:数据操作语言insertupdateselectdeleteMerge等操作

2:ddl语句:数据定义语言createalterdropdelete等

3:dcl语句:数据控制语言grant,revoke

                                       4:事务控制语句:rollback commit savapoint 

 日期函数:SysDate 得到 系统当前 时间 

 其他函数:decode 相当于java 中的if else 对字段的值进行重新编码,默认值以随便一个字符串表示。

                  trim 去除空格

                  toChar 将日期格式转化成字符串  

                  lower 转化成小写  upper 转化成大写

                  sysdata 日期函数

分组函数:  count  max min avg 

 11:oracle体系结构

完整的Oracle数据库通常由两部分组成:实例和数据库。

 
1、数据库是一系列物理文件的集合(数据文件,控制文件,参数文件 日志文件  当你执行 了 insert update delete 动作的时候,日志文件会记录你的相应信息。

等);

 
2、实例则是一组Oracle后台进程和内存区域。

12:游标(CURSOR)

游标是在关系数据库中经常使用,在PL/SQL程序中可以用CURSOR与SELECT一起对表或者视图中的数据进行查询并逐行读取。

Oracle游标分为显示游标和隐式游标。 

显示游标(ExplicitCursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标。

隐式游标(ImplicitCursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。

1.使用步骤

(1)定义 (2)打开 (3)使用 (4)关闭 

相关推荐