Oracle面试题

Oracle中function和procedure的区别?

function为函数,procedure为存储过程。

  1. 可以理解函数是存储过程的一种
  2. 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
  3. 函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
  4. 在sql数据操纵语句中只能调用函数而不能调用存储过程

Oracle的导入导出有几种方式,有何区别?

使用PLSQL相关工具

dmp文件方式
​ dmp文件是二进制的,可以跨平台,并且包含权限,支持大字段数据,是用的最广泛的一种。

sql文件方式

​ SQL文件可用文本编辑器查看,有利于可读性,但效率不如dmp文件,适合小数据量导入导出。尤其注意的是表中不能有大字段 (blob,clob,long)

pde文件

​ pde格式是PL/SQL 自带的文件格式,适用于PL/SQL工具,编辑器无法查看。

使用Oracle工具

​ 使用Oracle工具exp/imp

怎样优化Oracle数据库,有几种方式?

数据库性能最关键的因素在于I/O,优化数据库最关键的问题在于减少磁盘的I/O,优化Oracle可以分为物理和逻辑两个方面。

物理优化:

oracle的运行环境
使用合适的优化器
合理配置oracle实力参数
建立合适的索引,减少IO
建立表分区

逻辑优化

对表进行逻辑分割
对sql语句进行优化

Oracle中字符串用什么符号链接?

  1. 使用符号“||”
SELECT '工号为'||FNumber || '的员工姓名为' || FName FROM T_Employee
WHERE FName IS NOT NULL 
  1. 使用CONCAT()函数进行拼接,Oracle中的concat函数仅支持两个字符串进行拼接,如果要再多,可以嵌套使用。
SELECT CONCAT('工号:',FNumber) FROM T_Employee 

Oracle分区的优点?

Oracle的分区可以分为:列表分区、范围分区、散列分区、复合分区。

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

Oracle是怎样分页的?

Oracle中使用rownum来进行分页, 这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的

select * from 
  ( select rownum r,a from tabName where rownum <= 20 ) 
where r > 10

Oralce怎样存储文件,能够存储哪些文件?

Oracle 能存储 clob、nclob、 blob、 bfile
Clob 可变长度的字符型数据,也就是其他数据库中提到的文本型数据类型
Nclob 可变字符类型的数据,不过其存储的是Unicode字符集的字符数据
Blob 可变长度的二进制数据
Bfile 数据库外面存储的可变二进制数据

比较truncate和delete命令 ?

  1. Truncate 和delete都可以将数据实体删掉,truncate 的操作并不记录到 rollback日志,所以操作速度较快,但同时这个数据不能恢复
  2. Delete操作不腾出表空间的空间
  3. Truncate 不能对视图等进行删除
  4. Truncate是数据定义语言(DDL),而delete是数据操纵语言(DML)

简述oracle中 dml、ddl、dcl的使用

DML

(Data Manipulation Language,数据操作语言):用于检索或者修改数据。

DML包括:

​ SELECT:用于检索数据;

​ INSERT:用于增加数据到数据库;

​ UPDATE:用于从数据库中修改现存的数据

​ DELETE:用于从数据库中删除数据。

DDL

(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象。

DDL包括:DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令:

​ CREATE 创建

​ ALTER 修改

​ DROP 删除

DCL

(Data Control Language,数据控制语言):用于定义数据库用户的权限。

DCL包括:

GRANT 授权

REVOKE 回收权限

deny 拒绝授予主体权限。防止主体通过其组或角色成员身份继承权限

Oracle锁机制

在数据库中有两种基本的锁类型:

排它锁(Exclusive Locks,即X锁)
当数据对象被加上排它锁时,其他的事务不能对它读取和修改。

共享锁(Share Locks,即S锁)
加了共享锁的数据对象可以被其他事务读取,但不能修改。

数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:
DML锁(data locks,数据锁),用于保护数据的完整性;
DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
内部锁和闩(internal locks and latches),保护数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。
当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select …for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.

原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.

二、乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
阻塞

定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE

INSERT

Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。

UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。

Select …for update

当一个用户发出select…for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.

死锁-deadlock

定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

DML锁分类表

表1Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行级共享锁,其他对象
只能查询这些数据行 Select for update、Lock for

update、Lock row share

3 SX(Row-X) 行级排它锁,
在提交前不允许做DML操作 Insert、Update、
Delete、Lock row share

4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

oracle 锁问题的解决

可以用Spotlight软件对数据库的运行状态进行监控。

当出现session锁时,我们要及时进行处理.

  1. 查看哪些session锁:
    SQL语句:select ‘alter system kill session ‘’’||sid||‘,’||serial#||‘’‘;’ from v s e s s i o n w h e r e s i d i n ( s e l e c t s i d f r o m v session where sid in (select sid from v sessionwheresidin(selectsidfromvlock where block = 1);

SQL> select ‘alter system kill session ‘’’||sid||‘,’||serial#||‘’‘;’ from v s e s s i o n w h e r e s i d i n ( s e l e c t s i d f r o m v session where sid in (select sid from v sessionwheresidin(selectsidfromvlock where block = 1);
‘ALTERSYSTEMKILLSESSION’‘’||SID||‘,’||SERIAL#||‘’‘;’

alter system kill session ‘132,731’;
alter system kill session ‘275,15205’;
alter system kill session ‘308,206’;
alter system kill session ‘407,3510’;

  1. 查看session锁.
    sql语句:select s.sid, q.sql_text from v s q l t e x t q , v sqltext q, v sqltextq,vsession s
    where q.address = s.sql_address
    and s.sid = &sid
    order by piece;

SQL> select s.sid,q.sql_text from v s q l t e x t q , v sqltext q, v sqltextq,vsession s where q.address = s.sql_address and s.sid in (select sid from v$lock where block = 1) order by piece;
SID SQL_TEXT


   77 UPDATE PROFILE_USER SET ID=1,COMPANY_ID=2,CUSTOMER_ID=3,NAMED   
   77 _INSURED_ID=4,LOGIN=5,ROLE_ID=6,PASSWORD=7,EMAIL=8,TIME_ZON 
   77 E=9 WHERE PROFILE_USER.ID=:34 

3 rows selected.

  1. kill锁的进程.
    SQL语句:alter system kill session ‘77,22198’;

SQL> alter system kill session ‘391,48398’;
System altered.

  1. 查看谁锁了谁。
    select s1.username || [email=‘@’]‘@’[/email] || s1.machine
    || ’ ( SID=’ || s1.sid || ’ ) is blocking ’
    || s2.username || [email=‘@’]‘@’[/email] || s2.machine || ’ ( SID=’ || s2.sid || ’ ) ’ AS blocking_status
    from v l o c k l 1 , v lock l1, v lockl1,vsession s1, v l o c k l 2 , v lock l2, v lockl2,vsession s2
    where s1.sid=l1.sid and s2.sid=l2.sid
    and l1.BLOCK=1 and l2.request > 0
    and l1.id1 = l2.id1
    and l2.id2 = l2.id2 ;

注:

: 重定向输出,将文件的标准输出重新定向输出到文件,或将数据文件作为另一程序的标准输入内容。
| :UNIX管道:将一文件的输出作为另一文件的输入.

在执行SQL语句试:alter system kill session ‘391,48398’(sid为391); 应当注意对于sid在100以下的应当谨慎,可能该进程对应某个application,如对应某个事务,可以kill.

路在脚下

你可能感兴趣的:(数据库,oracle,数据库,sql)