Java面试常考题目之数据库

  1. 什么是事务?ACID
    事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。
    原子性(Atomicity):事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
    如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性
    隔离性(Isolation):由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
    隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
    持久性(Durability):事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
  2. 存储过程和函数有什么区别?
    Oracle中的函数与存储过程的区别:
    A:函数必须有返回值,而过程没有.
    B:函数可以单独执行.而过程必须通过execute执行.
    C:函数可以嵌入到SQL语句中执行.而过程不行.
    其实我们可以将比较复杂的查询写成函数.然后到存储过程中去调用这些函数.
    Oracle中的函数与存储过程的特点:
    A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
    B. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
    C.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
  3. 什么是存储过程?它有什么优点?
    存储过程是一组予编译的SQL语句,
    它的优点有:
    允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
    允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
    减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
    更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。
  4. 什么是触发器,它有哪些优点?
    触发器是一种特殊类型的存储过程,触发器主要通过事件触发而被执行的,
    触发器的优点:
    1.强化约束,触发器能够提供比CHECK约束。
    2.跟踪变化,触发器可以跟踪数据库内的操作,从而不允许未经允许许可的更新和变化。
    3.联级运算,比如某个表上的触发器中包含对另一个表的数据操作,而该操作又导致该表上的触发器被触发。
  5. 触发器分为事前触发和事后触发的区别。语句级触发和行级触发有何区别?
    事前触发器运行于触发事件发生之前,通常可以获取事件之前和新的字段值
    事后触发器运行于触发事件发生之后。
    语句级触发器可以在语句执行前或后执行,
    行级触发在触发器所影响的每一行触发一次
  6. 什么是索引?它有什么优点?
    索引象书的目录类似,索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值的列表,其中包含了各个值的行所存储的位置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能够大大提高数据库性能。
  7. 视图是什么?游标是什么?
    视图是一种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增该查操作,视图通常是一个或多个表的行或列的子集,视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(比如需要隐藏某些行或列),维护更方便。
    游标对查询出来的结果集作为一个单元来有效的处理,游标可以定位在结果集的特定行、从结果集的当前位置检索一行或多行、可以对结果集中当前位置进行修改。
  8. 使用索引查询一定能提高查询的性能吗?为什么?
    不能。如果返回的行数目较大,使用全表扫描的性能较好。
  9. 如何优化SQL语句
    1)对操作符的优化 尽量不采用不利用索引的操作符
    如:in ,not in , is nul, is not null,<>等
    2)对条件字段的一些优化
    采用函数处理的字段不能利用索引,
    进行了显式或隐式的运算的字段不能进行索引
    条件内包括了多个本表的字段运算时不能进行索引
    3 )在业务密集的SQL当中WHERE后面的条件顺序影响
    4)应用ORACLE的HINT(提示)处理
    5)查询表顺序的影响
  10. 怎么优化数据库(在数据百万条记录的数据库中 Oracle)?
    使用索引、建立分区,分区索引、使用存储过程
  11. SQL海量数据查询优化性能
    数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据的量积累到一定的程度,比如一个银行的账户数据库表信息积累到上百万甚至上千万条记录,全表扫描一次往往需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见查询优化技术的重要性。
  12. 数据库内联与外联的区别?
    内部联接(inner join)一个联接,返回两表的公共列都匹配的行
    外部联接(outer join) 一个联接,该联接还包括那些和联接表中记录不相关的记录。您可以创建一个外部联接的三种变形来指定所包括的不匹配行:
    左外部联接、右外部联接和完全外部联接。
    左外部联接(left outer join) 左边的表是主表,列所有;右表无取null
    右外部联接(right outer join) 右边的表是主表,列所有;左边表只列匹配的行,没有值置null
    完全外部联接 列所有,没有值置null
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章