数据库面试题目经典大全

来源:互联网 发布:mp4淘宝 编辑:程序博客网 时间:2024/05/18 05:03
1、事务
    事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。例如,网上购物的交易过程至少包括以下几个步骤的操作:
(1)更新客户所购商品的库存信息。
(2)保存客户付款信息。
(3)生成订单井且保存到数据库中。
(4)更新用户相关信息,如购物数量等 。
    在正常的情况下,这些操作都将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果遇到突然掉电或是其他意外情况,导致这一系列过程中任何一个环节出了差错,如在更新商品库存信息时发生异常、顾客银行账户余额不足等,都将导致整个交易过程失败。而一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态,即原有的库存信息没有被更新、用户也没有付款、订单也没有生成。否则,数据库的信息将会不一致,或者出现更为严重的不可预测的后果,数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
    事务必须满足4个属性即原子性(atomicity)、一致性(consistency )、隔离性(isolation)、持久性( durability),即ACID 4种属性。
2、什么是存储过程,与函数有什么区别?
    SQL语句执行的叶候要先编译然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定的存储过程的名字来调用执行。存储程是一组予编译的SQL语句。
    使用存储过程可以增强SQL语言的功能和灵活性,由于可以用流程控制语句编写存储过程,有很强的灵活性,所以可以完成复杂的判断和运算,且可以保证数据的安全性和完整性,同时,存储过程可以使没有权限的用户在控制之下间接地存取数据库,也保证了数据的安全。但存储过程不等于函数,两者虽然本质上没有区别,但具体而言有以下几个方面的区别:
   (1)存储过程一般是作为个独立的部分来执行的,而函数可以作为查询语句的一个部分来调用。由于函数可以返回一个对象,因此它一般在查询语句中位于From关键字的后面。
   (2)一般而言,存储过程实现的功能较复杂,而函数实现的功能针对性比较强。
   (3)函数需要用括号包住输入的参数,且只能返回一个值或表对象,存储过程可以返回多个参数。
   (4)函数可以嵌入在SQL中使用,可以在select中调用,存储过程不行。
   (5)函数不能直接操作实体表,只能操作内建表
   (6)存储过程在创建时即在服务器上进行了编译,执行速度更快。
3、什么是死锁?
    在操作系统中有若干程序并发执行,它们不断地申请、释放资源,在此过程中,由于争夺资源而处于无限期的等待状态,造成程序无法继续执行,若无外力作用,它们都将无法推进下去,这时称系统处于死锁状态或系统产生了死锁。此时便只能通过外来打破这种状态。
    产生死锁的原因有以下3点。
    (1)首先,系统资源不足,在系统中常常有多个进程共享资源的情况,如打印机,这些资源在同一时刻只能被一个进程使用。当资源数目不能满足进程时,便可能因为抢夺资源产生死锁。    (2)其次,进程运行推进顺序不对,进程在运行中具有异步性,当进程推进顺序不当时,便产生死锁。例如,进程P1和P2,两进程同时具有R1和R2两个资源时,才能执行,当两进程并发执行时,若P1保持资源R1,P2保持资源R2,双方都在等待对方释放资源,此时便发生了死锁。
    (3)最后,资源分配不当,如果系统资源充足,进程的资源请求都能得到满足,死锁的可能性会被大大降低,而进程推进顺序与速度不同,也可能会产生死锁。总的来说,产生死锁有4个必要条件:1) 互斥,每个资源每次只能被一个进程使用;2)请求与保持等待,一个进程因请求资源而被阻塞时,对已获得的资源保持不放;3)不可剥夺,进程已获得的资源,在未使用完之前,不能强制剥夺;4)环路等待,若干进程之间形成首尾相接的等待资源关系。
    所以,为了预防死锁,就要打破产生死锁的4个条件中的一个或多个,网此需要最大限度地增加系统资源,合理地安排进程的顺序井确定合理的分配资源的算法。避免死锁是在资源的动态分配过程中,采取有效的方法防止系统进入不安全状态,达到预防死锁的目的,其中最具代表性的方法就是银行家算法。
4、什么是共享锁?互斥锁?
    在数据库中,锁主要是对数据进行读/写的一种保护机制,从数据库系统的角度来看,一般可以将锁分为共享锁和互斥锁。共享锁简称S锁,也叫读锁。用于不更改或不更新数据的操作(只读操作),如select语句。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。共享锁可阻止其他并发运行的程序获取重叠的独占锁定,但是允许该程序获取重叠的共享锁定。其他用户可以获取共享锁锁定的资源,但是不能进行修改该共事锁。在执行select命令时,SQL Server 通常会对对象进行共享锁锁定。若事务T对数据D加S锁,则其他事务只能对D加S 锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。通常加共享锁的数据页被读取完毕后 ,共享锁就会立即被释放。互斥锁简称X锁,也叫排他锁,用于数据修改操作,如insert、update或delete。确保不会同时对同一资源进行多重更新。为了保证数据操作的完整性,引入了互斥锁。用互斥锁来保证在任意时刻,只能有一个线程访问对象。若事务T对数据D加X锁,则其他任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排他锁,所以排他锁又称为写锁。
    而对于锁的使用,也有一定的限制,需要遵守两个事项:1)先锁后操作;2)事务结束之后必须解锁。
5、什么是CHECK约束?
    CHECK约束是指限制表中某一列或某些列中可接受的数据值或数据格式,它用于限制列的取值范围,使用形式为:CHECK(约束表达式),如果是对单列定义CHECK 约束,那么该列只允许特定的值;如果是对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。例如,对于一个员工信息表,给员工的年龄属性添加了一个约束,即年龄必须大于0且小于等于120,那么用户在输入年龄的时候,就必须遵守该约束,输入负数或者121就无法输入。
6、什么是试图
    视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,不同于基本表。它是一个虚表,在数据库中,存放的只是视图的定义而己,不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。
    视图的作用非常多,主要有以下几点:首先可以简化数据查询语句;其次可以使用户能从多角度看待同一数据;然后,通过引入视图,可以提高数据的安全性;最后,视图提供了一定程度的逻辑独立性等 。
    通过引入视图机制,用户可以将注意力集中在其关心的数据上而非全部数据,这样就大大提高了用户效率与用户满意度,而且如果这些数据来源于多个基本表结构,或者数据不仅来自于基本表结构,还有一部分数据来源于其他视图,井且搜索条件又比较复杂时,需要编写的查询语句就会比较繁琐,此时定义视图就可以便数据的查询语句变得简单可行。定义视图可以将表与表之间复杂的操作连接和搜索条件对用户不可见,用户只需要简单地对一个视图进行查询即可,所以增加了数据的安全性,但是不能提高查询的效率。
7、什么是触发器?
    触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动。当数据库有特殊自操作时,对这些操作由数据库中的事件来触来自动完成这些SQL语句。使用触发器可以月来保证数据的有效性和完整性,完成比约束更复杂的数据约束。根据SQL语句的不同,触发器可分为两类:DML触发器和DLL触发器。
    DML触发器是当数据库服务器发生数据操作语言事件时执行的存储过程,有After和Instead Of两种触发器。After触发器被激活触发是在记录改变之后进行的一种触发器。Instead Of触发器是在记录变更之前,去执行触发器本身所定义的操作,而不是执行原来SQL语句里的操作。DLL触发器是在响应数据定义语言事件时执行的存储过程。
    触发器的主要作用表现在以下几个方面:
   (1)增加安全性。
   (2)利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。
   (3)维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。
   (4)实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。
   (5)触发器是自动的,它们在对表的数据做了任何修改之后就会被激活。例如,可以自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。以某企业财务管理为例,如果企业的资金链出现短缺,并且达到某种程度时,则发送警告信息。
    引申:触发器分为事前触发和事后触发,两者有什么区别?语旬组触发和行组触发有什么区别?
    事前触发发生在事件发生之前验证一些条件或进行有一些准备工作;事后触发器发生在事件发生之后,做收尾工作,保证事务的完整性。而事前触发可以获得之前和新的字段值。语句级触发器可以在语句执行之前或之后执行,而行级触发在触发器所影响的每一行触发一次。
8、什么是索引?
    索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段的值,升序或降序排序创建的对象。当用户查询索引字段时,它可以快速地执行检索操作,借助索引,在执行查询的时候不需要扫描整个表就可以快速地找到所需要的数据。索引是与表或视图关联的磁盘上结构,即对表中列值排序的一种结构 ,可以加快从表或视图中检索行的速度,执行查询时不必扫描整个表就能更快速的访问数据库中的信息。
    一条索引记录包含键值和逻辅指针。创建索引时,系统分配一个索引页。在表中插入一行 数据,同时也向该索引页中插入一行索引记录。索引记录包含的索引字段值比真 实数据量小,节省了空间。
    索引的类型有聚焦索引和非聚焦索引。聚集索引是表中的行的物理顺序与键值的逻辑顺序一样 ,一个表只能有一个聚焦索引。与非聚焦索引相比,聚焦索引一般情况下可以获得更快的数据访问速度。非聚焦索引是数据存储与索引存储不在同一个地方。索引中有指针,该指针指向数据的存储位置,索引中的项目按索引之前的顺序存储,而表中的信息技另一种顺序存储。
    创建索引可以大大提高系统的性能,主要表现在以下几个方面:1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;2)通过索引,可以大大加快数据的检索速度;3)通过索引可以加速表和表之间的连接,从而有效实现数据的参考完整性;4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
    索引可以有效地提高查询效率,那为什么不将所有的列都建立索引呢?其实索引尽管可以带来方便,但并非越多越好,过多的索引也会带来许多不利的问题。首先,创建索引和维护索 引要耗费时间、空间。当数据量比较小时,这种问题还不够突出:而当数据量比较大时,这种 缺陷会比较明显,效率会非常低下。其次,除了数据表 占数据空间之外,每一个索引还需要占用一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大,从而造成不必要的空间浪费。最后,当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,从而降低了数据的维护速度。
9、什么是回滚?
    为了保证在应用程序、数据库或系统出现错误后,数据库能够被还原,以保证数据库的完整性 ,所以需要进行回滚。回滚(rollback)就是在事务提交之前将数据库数据恢复到事务修改之前数据库数据状态。
    需要注意回楼与撤销的区别。回滚是指将数据库的状态恢复到执行事务之前的状态,其中可能会使用UNDO日志进行回漆。撤销是一种记录日志的方式,并不是主要服务于事务回滚,而是主要用于系统从故障中恢复。例如,系统突然断电,系统要根据UNDO日志对未完成的事务进行处理,保证数据库的状态为执行这些事务前的状态。
10、数据备份有哪些种类?
    在网络运行与维护过程中,经常有一些难以预料的因素会导致数据的丢失,如硬件损坏、 操作失误等,而且丢失的数据通常又会对企业的业务产生非常不利的影响,所以必须不定期地对在据进行及时备份,以便在灾难发生后能够迅速地恢复数据 。数据备份就是保存数据的备份,目的是为了预防灾难造成的数据损失。它一般分为完全备份、差异备份、事务日志备份 、增量备份几大类。
    (1)完全备份是将数据库中的全部信息进行备份,它是恢复的基线,在进行完全备份时,不但备份数据库的数据文件、日志文件,还需要备份文件的存储位置信息以及数据库中的全部对象和相关信息。在对数据库进行完全备份时,所有未完成 的事务或发生在备份过程 中的事务部将 被忽略,如果使用完全数据库备份类型,那么从开始备份到开始恢复这段时间内发生的任何针对数据库的修改都将无法恢复。所以,只有在一定的要求或条件下才使用这种备份类型。
    (2)差异备份是备份从最近的完全备份之后对数据所作的修改,它以完全备份为基准点,备份完全各份之后变化了的数据文件、日志文件以及数据库中其他被修改的内容。差异备份耗费的时间比完全备份少,但也会占用一些时间,同完全备份一样,差异备份过程中也允许用户访问数据库井对数据进行操作,并且在差异备份过程中会把这些操作也一起备份起来。
    (3)事务日志备份是备份从上次备份之后的日志记录,而且在默认情况下,事务日志备份完成后要截断日志,事务日志备份记录了用户对数据进行的修改操作。随着时间的推移,日志中的记录数会越来越多,容量有时比数据库备份大,这样势必会占满整个磁盘空间。因此,为了避免这种情况的发生,必须定期地将日志记录中不必要的记录清除掉,以节省空间。清除掉无用日志记录的过程叫做截断日志。
    (4)增量备份是针对于上一次备份的,备份上一次备份后所有发生变化的文件。在增量备份过程中,只备份有标记的选中的文件和文件夹,它清除标记,即备份后标记文件。
    例如,对于数据库而言 ,按照生活规律,一般应该在星期一进行完全备份,在星期二至星期五进行差异备份。如果在星期五数据被破坏了,则只需要还原星期一完全的备份和星期四的差异备份。这种策略备份数据需要较多的时间,但还原数据使用较少的时间。
    再例如,在星期一进行完全备份,在星期二至星期五进行增量备份。如果在星期五数据被破坏了,则需要还原星期一正常的备份和从星期二至星期五的所有增量备份。这种策略备份数 据需要较多的时间,但还原数据使用较少的时间。
    与数据备份相对应的就是数据恢复,数据恢复是指将数据恢复到事故之前的状态,可以将其看成数据备份操作的逆过程。数据备份是数据恢复的前提,数据恢复是数据备份的目的,无法恢复的数据备份是没有任何意义的。
11、什么是游标?
    在数据库中,游标提供了一种对从表中检索出的数据进行操作的灵活手段。它实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
    游标总是与一条SQL选择语句相关联,因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
    游标允许应用程序对查询语句select返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作。它还提供对基于游标位置而对表中数据进行删除或更新的能力。而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
    游标的优点有以下两个方面的内容:
(1)在使用游标的表中,对行提供删除和更新的能力。
(2)游标将面向集合的数据库管理系统和面向行的程序设计连接了起来。
12、并发环境下如何保证数据的一致性?
    并发一般是指多用户间时访问相同的数据。数据一致性是指系统中每个用户都能够取得具备一致性的数据,同时还能够看到自己或其他用户所提交的事务对数据的修改。
    在并发环境下,一般可以采用多种机制来保证数据的一致性。例旧,Oracle系统提供的事务级的一致性、行级锁、表级锁等。下面只介绍行级锁。     
    提交读和串行性事务都使用行级锁,都会在试图修改一个没有提交的并行事务更新的行时的产生等待。第二个事务等待其他事务提交或者撤销来释放它的锁,才能更新给定的行。不管等待的是什么级别的隔离事务,若其他事务回滚了,都可以对以前锁定的行进行修改。
13、如果数据库日志满了会出现什么情况?
    日志文件(Log File)记录所装对数据库数据的修改,主要是保户数据库以防止故障,以及复数据时使恢复用。其特点如下:
   (1)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员;
   (2)日志文件组以循环方式进行写操作;
   (3)每一个日志文件成员对应一个物理文件。
    通过日志文件来记录数据库事务可以最大限度地保证数据的一致性与安全性,但一旦数据库中日志满了,就只能执行查询等读操作,不能执行更改、备份等操作。其原因是任何写操作都要记录日志,也就是说基本上处干不能使用的状态。
14、如何判断谁往数据库中插入了一行数据?
    可以通过以下3种方法来达到这个目的:事先打开审计功能、表上建立触发器或者查看logmnr等。
   (1)审计功能。
    先设置audit_trail参数,决定审计结果的保存地点,然后执行audit insert on schema.table_name whenever successful;当有执行insert 操作的动作后,根据 audit_trail参数到相应位置去看审计结果即可。
   (2)触发器。
    create or replace trigger tgname
    after insert
    on tbname  →判断此表是否被插入记录
    for each row
    begin
      insert into ta(日期) values(sysdate);
      commrt;
    end; 
    只需要将代码中的bname换成实际的表的名称即可。需要注意的是,建立触发器实质上也是审计,只是它是基于值的审计比数据库审计慢。
   (3)通过logmnr日志查看。
    logmnr是Oracle公司提供的分析工具,该工具轻巧实用,使用该工具可以轻松获得Oracle重作日志文件 (归档日志文件)中的具体内容,而且该工具可以分析出所有对于数据库操作的 DML(insert、update、delete等)语句、DDL语句等,另外还可分析得到一些必要的回滚语句。所以,该工具特别适用于调试、审计或者回滚某个特定的事务。
0 0
原创粉丝点击