数据库中常见面试题整理

一、 数据库三范式是什么?

  1. 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
  2. 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
  3. 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一个值 >>2. 每一行都能区分。 >>3. 每一个表都不包含其他表已经包含的非主关键字信息。

二、 有哪些数据库优化方面的经验?

  1. 用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql
    发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。
  2. 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。
  3. 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
  4. UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用 UNION
    ALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为一
    个,但这两者从使用和效率上来说都有所不同。 >1. 对重复结果的处
    理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进行排
    序;UNION ALL 只是简单的将两个结果合并后就返回。

三、 请简述数据库中常用的索引有哪些种类?

  1. 普通索引: 即针对数据库表创建索引
  2. 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值
  3. 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
  4. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。

四、 mysql 数据库中索引的工作机制是什么?

       数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

五、 mysql 的基础操作命令:

  1. MySQL 是否处于运行状态:Debian 上运行命令 service mysql
    status,在 RedHat 上运行命令 service mysqld status
  2. 开启或停止 MySQL 服务 :运行命令 service mysqld start 开启服
    务;运行命令 service mysqld stop 停止服务
  3. Shell 登入 MySQL: 运行命令 mysql -u root -p
  4. 列出所有数据库:运行命令 show databases;
  5. 切换到某个数据库并在上面工作:运行命令 use databasename; 进入
    名为 databasename 的数据库
  6. 列出某个数据库内所有表: show tables;
  7. 获取表内所有 Field 对象的名称和类型 :describe table_name;

六、何谓悲观锁与乐观锁?

       乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。

  1. 悲观锁

           总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁( 共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java 中 synchronized 和ReentrantLock 等独占锁就是悲观锁思想的实现。

  2. 乐观锁

           总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于 write_condition 机制,其实都是提供的乐观锁。在 Java 中 java.util.concurrent.atomic 包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。

  3. 两种锁的使用场景

           从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像 乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行 retry,这样反倒是降低了性能,所以 一般多写的场景下用悲观锁就比较合适。

<think>嗯,用户想要了解Oracle常见面试题整理。我需要先回想一下Oracle面试通常涉及哪些方面。可能包括SQL基础、PL/SQL、数据库设计、性能优化、备份恢复、高可用性等。 首先,用户可能是在准备面试,所以需要全面覆盖各个知识点。要分门别类,结构清晰,方便他们系统复习。常见面试题通常分为基础、进阶和高级部分,这样逐步深入。 基础部分应该包括SQL语句编写,比如基本查询、连接查询、子查询。还有聚合函数、分组过滤,比如GROUP BY和HAVING的区别。数据类型和约束也是基础,比如VARCHAR2和CHAR的区别,主键、外键的作用。 PL/SQL部分可能会问到存储过程、函数、触发器的区别和应用场景。异常处理机制,比如预定义异常和自定义异常的使用。游标类型,显式游标和隐式游标的同。 数据库设计方面,范式理论是必问的,比如第三范式的定义和应用。索引的类型和优化,B树索引和位图索引的区别,索引失效的情况。分区表的作用和类型,比如范围分区和列表分区。 性能优化方面,执行计划的查看和分析方法,比如使用EXPLAIN PLAN。SQL优化技巧,避免全表扫描的方法,绑定变量的优势。统计信息的作用和更新方式,DBMS_STATS包的使用。 备份恢复需要知道RMAN的基本用法,完全备份和增量备份的区别。归档模式和非归档模式的影响,比如恢复点同。闪回技术的应用场景,如表误删恢复。 高可用性方面,Data Guard的架构和模式,物理备库和逻辑备库的区别。RAC集群的工作原理,缓存融合机制。故障转移和负载均衡的实现方式。 权限管理部分,角色和系统权限的区别,如何控制用户访问。审计功能的使用,比如启用审计跟踪登录失败。 新特性可能包括12c以后的多租户架构,PDB和CDB的概念。JSON支持,In-Memory列存储的优势。 另外,要提醒用户注意结合项目经验准备,比如优化案例、设计案例。概念题需要理解原理,而仅仅是记忆。最好给出示例答案,但建议用户根据自己的理解总结。 需要检查是否有遗漏的重要知识点,比如锁机制、事务隔离级别,或者等待事件分析。确保每个部分都有典型问题,覆盖全面。语言要简洁明了,避免冗长,方便用户快速查阅和记忆。</think>以下整理了Oracle数据库常见面试题及核心知识点,分为基础、进阶、高级三部分,建议结合项目经验准备: --- ### **一、基础篇** 1. **SQL基础** - 编写查询:多表连接(JOIN)、子查询(Subquery)、集合操作(UNION/INTERSECT) - 聚合函数:`GROUP BY`与`HAVING`的区别?如何计算部门平均工资高于5000的部门? - 数据类型:`VARCHAR2`与`CHAR`的区别?`DATE`和`TIMESTAMP`的区别? 2. **约束与对象** - 主键(Primary Key)与唯一约束(Unique)的区别? - 外键(Foreign Key)的作用?删除父表记录时如何处理子表数据(ON DELETE CASCADE/SET NULL)? 3. **事务控制** - 解释ACID特性,Oracle默认的事务隔离级别是什么? - `COMMIT`和`ROLLBACK`的作用?`SAVEPOINT`如何使用? --- ### **二、进阶篇** 1. **PL/SQL编程** - 存储过程 vs 函数 vs 触发器:应用场景差异? - 如何处理异常?举例说明`NO_DATA_FOUND`和`TOO_MANY_ROWS`异常。 - 显式游标与隐式游标的区别?如何用`%ROWTYPE`声明记录类型? 2. **性能优化** - 如何查看SQL执行计划?`EXPLAIN PLAN`的使用步骤? - 索引失效的常见场景(如对列使用函数、隐式类型转换)?何时该建索引? - 统计信息的作用?如何用`DBMS_STATS`收集? 3. **分区与分片** - 分区表的作用?范围分区(Range)和列表分区(List)的区别? - 什么是分区剪裁(Partition Pruning)?如何提升查询性能? --- ### **三、高级篇** 1. **备份与恢复** - RMAN的作用?完全备份与增量备份的区别? - 归档模式(ARCHIVELOG)与非归档模式(NOARCHIVELOG)对恢复的影响? - 如何用闪回技术恢复误删除的表?`FLASHBACK TABLE`的语法? 2. **高可用架构** - Data Guard的工作原理?物理备库与逻辑备库的区别? - RAC集群如何实现负载均衡?什么是"Cache Fusion"? - 解释GoldenGate的实时数据复制机制。 3. **安全与监控** - 如何通过角色(Role)管理权限?`GRANT`和`REVOKE`的使用? - 如何监控锁冲突?`V$LOCK`视图包含哪些关键信息? - 使用AWR报告分析性能瓶颈的步骤? --- ### **高频考点扩展** - **索引类型**:B树索引 vs 位图索引 vs 函数索引 - **等待事件**:如何分析`enq: TX - row lock contention`? - **新特性**:12c多租户架构(CDB/PDB)、19c自动索引(Auto Indexing) - **设计题**:如何设计一个支持高并发的订单系统表结构? --- **建议准备方向**: 1. 结合项目经验:准备1-2个SQL优化案例或数据库设计案例 2. 概念题:重点理解原理(如索引工作原理、事务隔离实现机制) 3. 实操题:练习编写复杂SQL、PL/SQL块(如分页查询、数据清洗) > 示例答案片段: > **Q: 如何优化全表扫描的SQL?** > A: ① 检查WHERE条件是否可利用索引 ② 避免在索引列使用函数或运算 ③ 考虑分区表 ④ 评估统计信息准确性 ⑤ 使用绑定变量减少硬解析 建议根据自身经验调整答案侧重点,避免死记硬背。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monika、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值