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自动增长如何实现
select max(e1.rowid) from 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 409: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数据库通常由两部分组成:实例和数据库。
等);